Entity Framework Code Firstを使用する場合、デフォルトの規則では、必要なデータベースタイプが作成されないことがあります。たとえば、デフォルトでは、タイプSystem.DateTime
のプロパティは、タイプDateTime
のデータベース列を作成します。タイプをdatetime2
(タイムゾーンと夏時間に問題のないDateTime
タイプ)にしたい場合はどうすればよいですか?
DataTypeAtrribute
を使用して、データ注釈で必要なデータベースタイプを指定することができます。 DataTypeAttribute のコンストラクターの1つは、パラメーター DataType Enumeration を受け入れます。したがって、次のように指定できます。
[DataType(DataType.DateTime)]
public DateTime DateOfBirth {get; set;}
DataType列挙型には多くの型が含まれていますが、DateTime2
の値がありません。
別のアプローチは、FluentAPIを使用することです。メソッドにDateTime2
を作成します DBContext.OnModelCreating :
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().Property(p => p.BirthDate)
.HasColumnType("datetime2");
}
DataTypeAttributeには 文字列を受け入れる2番目のコンストラクター があります。この文字列は次のように定義されます
データフィールドに関連付けるカスタムフィールドテンプレートの名前。
したがって、datetime2を作成するには、以下で十分であると想定されます。
[DataType("datetime2")]
public DateTime DateOfBirth {get; set;}
残念ながら、これは機能しません。作成された列はまだDateTime
形式です。
Question:datetime2を作成するためにコンストラクターで使用する文字列はどれですか?
プロパティの列タイプを定義する方法にまだ興味がある人のために。 EFバージョン6.0以降では、あるタイプのすべての値に何らかのデータベースタイプが必要であると定義できます。
これは、DbContext.OnModelCreating
で DbModelBuilder.Properties を使用して実行されます。
これを行う場合、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.Properties<DateTime>()
.Configure(property => property.HasColumnType("datetime2"));
// every property of type decimal should have a precision of 19
// and a scale of 8:
modelBuilder.Properties<decimal>()
.Configure(property => property.HasPrecision(19, 8));
}
DataType属性はコードファーストの列タイプマッピングには使用されません :
列アノテーションは、マップされた列の属性を指定するのに優れています。名前、データ型、または列がテーブルに表示される順序を指定できます。 [...]列のTypeName属性をDataTypeDataAnnotationと混同しないでください。 DataTypeはUIに使用される注釈であり、最初にコードによって無視されます。
そう:
[Column(TypeName="datetime2")]