Laden...

Wie in von EntityTypeConfiguration<Entity> abgeleiteten Klasse für Property Defaultvalue setzen?

Erstellt von bigeddie vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.552 Views
B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 4 Jahren
Wie in von EntityTypeConfiguration<Entity> abgeleiteten Klasse für Property Defaultvalue setzen?

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😉

16.806 Beiträge seit 2008
vor 4 Jahren

10 Sekunden Blick in die Doku hätte Dir gezeigt, dass das über HasColumnAnnotation funktioniert. 👍

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 4 Jahren

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😉

W
955 Beiträge seit 2010
vor 4 Jahren

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. 😃

16.806 Beiträge seit 2008
vor 4 Jahren

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.

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 4 Jahren

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😉

16.806 Beiträge seit 2008
vor 4 Jahren

Keine Ahnung, wie Du zu dem Fazit kommt.
Es stimmt einfach nicht.

  • Man kann problemlos default Values setzen (durch das Schema) oder eben durch POCO Properties
  • Dies geht sowohl für statische Values wie auch für GETDATE()

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.