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:
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 :
Das DataTypeAttribute hat einen zweiten Konstruktor, der eine Zeichenfolge akzeptiert . Diese Zeichenfolge ist als
definiertDer 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?
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:
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%Tags und Links c# entity-framework dbcontext