2015-11-03 25 views
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 Typ DateTime, der keine Probleme mit Zeitzonen und Sommerzeit hat) hat?Entity Framework Code Zuerst: Welches DataType-Attribut für DateTime2?

Es ist möglich, den gewünschten Datenbanktyp mit Datenanmerkungen unter Verwendung einer DataTypeAtrribute anzugeben. Einer der Konstruktoren von DataTypeAttribute akzeptiert einen Parameter DataType Enumeration. So könnte man angeben, so etwas wie:

[DataType(DataType.DateTime)] 
public DateTime DateOfBirth {get; set;} 

Der Datatype Aufzählungstyp eine Menge Typen enthält, jedoch wird es einen Wert für DateTime2 fehlt.

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

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Student>().Property(p => p.BirthDate) 
     .HasColumnType("datetime2"); 
} 

Die Datatype eine second constructor that accepts a string hat. Diese Zeichenfolge ist definiert als

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

So würde man annehmen, dass die folgende genug sein würde, eine datetime2 zu erstellen:

[DataType("datetime2")] 
public DateTime DateOfBirth {get; set;} 

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

Frage: Welche Zeichenfolge im Konstruktor verwenden, um eine Datetime2 zu erstellen?

Antwort

18

The DataType attribute is not used for column type mapping for Code First:

Die Column Annotation ist ein geschickter in die Attribute einer kartiert Spalte angibt. 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 zuerst vom Code ignoriert wird.

So:

[Column(TypeName="datetime2")] 
4

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

Wenn Sie dies tun, müssen Sie keine Attribute oder flüssige API für jede DateTime schreiben. Es ist einfacher konsistent zu sein und alle DateTime den gleichen Spaltentyp zu haben. In ähnlicher Weise 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 haben sollte; Jeder System.Decimal sollte einen Spaltentyp mit einer bestimmten Genauigkeit haben.In DbContext würden Sie schreiben:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // every property of type DateTime should have a column type of "datetime2": 
    modelBuilder.Property<DateTime>() 
     .Configure(property => property.HasColumnType("datetime2"); 
    // every property of type decimal should have a precision of 19 
    // and a scale of 8: 
    modelBuilder.Property<decimal>() 
     .Configure(property => property.HasPrecision(19, 8); 
} 
Verwandte Themen