Entity Framework Code Zuerst: Welches DataType-Attribut für DateTime2?

8

Manchmal bei der Verwendung von Entity Framework Code Zuerst erstellen die Standardkonventionen nicht den gewünschten Datenbanktyp. Zum Beispiel erstellt eine Eigenschaft vom Typ System.DateTime standardmäßig eine Datenbankspalte vom Typ DateTime . Was ist zu tun, wenn Sie möchten, dass ein Typ datetime2 (der DateTime -Typ, der keine Probleme mit Zeitzonen und Sommerzeit hat) hat?

Es ist möglich, den erforderlichen Datenbanktyp mit Datenanmerkungen unter Verwendung von DataTypeAtrribute anzugeben. Einer der Konstrukteure von DataTypeAttribute akzeptiert ein Parameter DataType Enumeration . So könnte man etwas wie angeben:

%Vor%

Der DataType-Aufzählungstyp enthält viele Typen, es fehlt jedoch ein Wert für DateTime2 .

Ein anderer Ansatz wäre die Verwendung von Fluent API. Erstellen Sie in der Methode DBContext ein DateTime2 . OnModelCreating :

%Vor%

Das DataTypeAttribute hat einen zweiten Konstruktor, der eine Zeichenfolge akzeptiert . Diese Zeichenfolge ist als

definiert
  

Der Name der benutzerdefinierten Feldvorlage, die dem Datenfeld zugeordnet werden soll.

Man würde also annehmen, dass das Folgende ausreichen würde, um ein Datetime2 zu erstellen:

%Vor%

Leider funktioniert das nicht. Die erstellte Spalte hat immer noch das Format DateTime .

Frage : Welche Zeichenfolge wird im Konstruktor verwendet, um ein datetime2 zu erstellen?

    
Harald Coppoolse 03.11.2015, 09:45
quelle

2 Antworten

5

Für diejenigen, die noch daran interessiert sind, wie man Spaltentypen für Eigenschaften definiert. In DbContext.OnModelCreating können Sie definieren, dass jeder Wert eines Typs einen Datenbanktyp haben soll.

Wenn Sie dies tun, müssen Sie weder Attribute noch flüssige API für jede DateTime schreiben. Es ist einfacher konsistent zu sein und alle DateTime den gleichen Spaltentyp zu haben. Ebenso können Sie allen Dezimalstellen die gleiche Genauigkeit geben, auch wenn in Zukunft Dezimalzahlen hinzugefügt werden.

Angenommen, Sie möchten definieren, dass jeder System.DateTime den Spaltentyp DateTime2 haben soll; Jedes System.Decimal sollte einen Spaltentyp mit einer bestimmten Genauigkeit haben. In DbContext würden Sie schreiben:

%Vor%     
Harald Coppoolse 29.08.2017, 06:59
quelle
18

Das DataType-Attribut wird nicht für die Spaltentypzuordnung für Code First verwendet :

  

Mit der Annotation "Column" können Sie die Attribute einer zugeordneten Spalte besser beschreiben. Sie können einen Namen, einen Datentyp oder sogar die Reihenfolge angeben, in der eine Spalte in der Tabelle erscheint. [...] Verwechseln Sie das TypeName-Attribut der Spalte nicht mit DataType DataAnnotation. DataType ist eine Anmerkung, die für die Benutzeroberfläche verwendet wird und von Code zuerst ignoriert wird .

Also:

%Vor%     
CodeCaster 03.11.2015 09:48
quelle

Tags und Links