myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Datentechnologien » Wie in von EntityTypeConfiguration<Entity> abgeleiteten Klasse für Property Defaultvalue setzen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
bigeddie bigeddie ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.07.2007
Beiträge: 365
Entwicklungsumgebung: VS2017Community
Herkunft: Mannheim


bigeddie ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von bigeddie am 10.02.2020 00:16.

10.02.2020 00:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.442
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

10 Sekunden Blick in die Doku hätte Dir gezeigt, dass das über HasColumnAnnotation funktioniert. Daumen hoch
10.02.2020 17:18 Beiträge des Benutzers | zu Buddylist hinzufügen
bigeddie bigeddie ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.07.2007
Beiträge: 365
Entwicklungsumgebung: VS2017Community
Herkunft: Mannheim

Themenstarter Thema begonnen von bigeddie

bigeddie ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Abt,

10s Blick in die Doku hat mir gezeigt, dass es "HasColumnAnnotation" gibt. Soweit so gut stimmen wir überein. ABER

C#-Code:
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

C#-Code:
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):

C#-Code:
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
11.02.2020 17:04 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 844


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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. :-)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von witte am 11.02.2020 18:15.

11.02.2020 18:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.442
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
11.02.2020 19:25 Beiträge des Benutzers | zu Buddylist hinzufügen
bigeddie bigeddie ist männlich
myCSharp.de-Mitglied

Dabei seit: 02.07.2007
Beiträge: 365
Entwicklungsumgebung: VS2017Community
Herkunft: Mannheim

Themenstarter Thema begonnen von bigeddie

bigeddie ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
12.02.2020 20:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.442
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
      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.

C#-Code:
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.
12.02.2020 20:47 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 19.02.2020 15:06