2015-11-03 12 views
8

Entity Framework Code Firstを使用する場合、デフォルトの規則では、必要なデータベースタイプが作成されません。たとえば、デフォルトではSystem.DateTimeのプロパティは、DateTimeのデータベース列を作成します。 datetime2(タイムゾーンと夏時間に問題がないタイプのDateTime)を使用する場合はどうすればよいですか?エンティティフレームワークコードファースト:DateTime2のどのDataType属性?

DataTypeAtrributeを使用して、データ注釈で必要なデータベースタイプを指定することができます。 DataTypeAttributeのコンストラクタの1つは、パラメータDataType Enumerationを受け取ります。しかし、それはDateTime2の値が欠落している、データ型の列挙型は種類が多く含ま

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

:だから1は次のようなものを指定することができます。

もう1つのアプローチは、Fluent APIを使用することです。方法DBContext.OnModelCreatingDateTime2を作成します。

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

DataTypeAttributeがsecond constructor that accepts a stringを持っています。この文字列は次のように定義されます

データフィールドに関連付けるカスタムフィールドテンプレートの名前。

だから、1は次のDATETIME2を作成するのに十分だろうことを前提としています:

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

ああ、これは動作しません。作成された列はまだDateTimeの形式です。

質問:datetime2を作成するためにコンストラクタで使用する文字列はどれですか?

答えて

18

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

列の注釈がマッピングされた列の属性を指定することで、より熟達しています。テーブルに列が表示される順序、名前、データ型を指定することもできます。 [...] ColumnのTypeName属性とDataType DataAnnotationを混同しないでください。 DataTypeはUIで使用される注釈で、最初にコードによって無視されます

ので:プロパティの列型を定義する方法でまだ興味のある方のために

[Column(TypeName="datetime2")] 
4

DbContext.OnModelCreatingでは、あるタイプのすべての値にある種のデータベースタイプがあることを定義することができます。

これを行うと、すべてのDateTimeに属性や流暢なAPIを書き込む必要はありません。一貫性があり、すべてのDateTimeに同じ列型を持たせる方が簡単です。同様に、小数点が将来追加されても、すべての小数点に同じ精度を与えることができます。

System.DateTimeにはすべて、カラムタイプがDateTime2であることを定義するとします。 System.Decimalには、指定された精度の列型が必要です。DbContextでは、次のように記述します。

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); 
}