verwendetes Datenbanksystem: EF6 & SQL Server
Hallo,
wie kann ich in einer von EntityTypeConfiguration<Entity> abgeleiteten Klasse für ein Property einen Default-Value definieren?
Viele Grüße
Bigeddie
Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉
10 Sekunden Blick in die Doku hätte Dir gezeigt, dass das über HasColumnAnnotation
funktioniert. 👍
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo Abt,
10s Blick in die Doku hat mir gezeigt, dass es "HasColumnAnnotation" gibt. Soweit so gut stimmen wir überein. ABER
public DatumsModelConfiguration()
{
this.HasKey<int>(p=>p.Id);
this.Property(p=>p.Datum).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("DefaultValueSql", "GETDATE()");
}
produziert mir bei der Migration
public override void Up()
{
CreateTable(
"dbo.DatumsModels",
c => new
{
Id = c.Int(nullable: false, identity: true),
Datum = c.DateTime(nullable: false,
annotations: new Dictionary<string, AnnotationValues>
{
{
"defaultValueSQL",
new AnnotationValues(oldValue: null, newValue: "GETDATE()")
},
}),
})
.PrimaryKey(t => t.Id);
}
Erwartet hätte ich jedoch (durch aktiven Eingriff in die Migration):
public override void Up()
{
CreateTable(
"dbo.DatumsModels",
c => new
{
Id = c.Int(nullable: false, identity: true),
Datum = c.DateTime(nullable: false, defaultValueSql:"getdate()")
})
.PrimaryKey(t => t.Id);
}
So dass eigentlich
CREATE TABLE DatumsModel (
Id int NOT NULL IDENTITY,
Datum datetime NOT NULL DEFAULT 'getdate()',
CONSTRAINT PK_dbo.DatumsModels PRIMARY KEY (Id)
)
als Script generiert werden sollte.
Nun noch die Frage: Wo liegt der Fahler?
Viele Grüße
Bigeddie
Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉
Von https://stackoverflow.com/questions/8594431/possible-to-default-datetime-field-to-getdate-with-entity-framework-migrations
"Setting default value in code allows only static values."
Auch 10 Sekunden. 😃
Es ist unbekannt, was Du vor hast - aber ich würde ein Zeitstempel auch nicht automatisch vom Server setzen lassen, sondern mit DateTimeOffset.UtcNow
arbeiten, wie es seit EF 4 bereits der empfohlene Weg ist - also seit fast 10 Jahren (und allgemein der empfohlene Weg von Zeitstempeln in Datenbanken darstellt).
GETDATE() war noch nie ein ratsamer Weg.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo,
GETDATE() ist nicht auf meinem Mist gewachsen, sondern ein Requirement des Projektes welches ich grade bearbeite.
Anscheinend ist in EF6 (6.4) das Setzen eines Default-Value über eine ModelConfiguration nicht möglich, da ansonsten einer von euch darauf eingegangen wäre.
In EF Core 3.1, welches ich eigentlcih vorgeschlagen habe, ist dies kein Problem aber mein PM macht mir entsprechende Vorgaben.
Vielen Dank für eure Posts und
viele Grüße
Bigeddie
Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉
Keine Ahnung, wie Du zu dem Fazit kommt.
Es stimmt einfach nicht.
Sowohl in EF 4,5 und 6 und auch in der gesamten EF Core Reihe.
Aber auch was Du hier gestaltet hast
this.Property(p=>p.Datum).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("DefaultValueSql", "GETDATE()");
zeigt nicht gerade, dass Du EF verstanden hast: weder das Required noch das HasDatabaseGeneratedOption macht hier in irgendeiner Kombination Sinn 😃
Wenn Dir der generierte Migrationscode nicht passt, dann kannst Du ihn anpassen.
public override void Up()
{
CreateTable(
"dbo.DatumsModels",
c => new
{
Id = c.Int(nullable: false, identity: true),
Datum = c.DateTime(nullable: false, defaultValueSql: "GetDate()")
})
.PrimaryKey(t => t.Id);
}
EF Migrations hat noch nie jeden Fall abgedeckt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code