Entity Framework Code Firstメソッドを使用してデータベーステーブルを作成しています。次のコードは、データベースにDATETIME
列を作成しますが、DATE
列を作成したいです。
[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }
テーブルの作成中にDATE
型の列を作成するにはどうすればよいですか?
David Rothの回答のEF6バージョンは次のとおりです。
public class DataTypePropertyAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention<DataTypeAttribute>
{
public override void Apply(ConventionPrimitivePropertyConfiguration configuration,
DataTypeAttribute attribute)
{
if (attribute.DataType == DataType.Date)
{
configuration.HasColumnType("Date");
}
}
}
これを以前のように登録します。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}
これは、ジョブにEF基本クラスを使用していることを除いて、Tyler Durdenのアプローチと同じ結果になります。
System.ComponentModel.DataAnnotations
からColumnAttribute
(EntityFramework.dllで定義)を使用してみてください。
[Column(TypeName="Date")]
public DateTime ReportDate { get; set; }
これはEF6でうまく機能していることがわかりました。
データ型を指定するための規則を作成しました。この規則により、データベース作成のデフォルトのDateTimeデータ型がdatetimeからdatetime2に変更されます。次に、DataType(DataType.Date)属性で装飾したすべてのプロパティに、より具体的なルールを適用します。
public class DateConvention : Convention
{
public DateConvention()
{
this.Properties<DateTime>()
.Configure(c => c.HasColumnType("datetime2").HasPrecision(3));
this.Properties<DateTime>()
.Where(x => x.GetCustomAttributes(false).OfType<DataTypeAttribute>()
.Any(a => a.DataType == DataType.Date))
.Configure(c => c.HasColumnType("date"));
}
}
次に、コンテキストを登録してから規則を登録します。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Add(new DateConvention());
// Additional configuration....
}
日付のみにしたいDateTimeプロパティに属性を追加します。
public class Participant : EntityBase
{
public int ID { get; set; }
[Required]
[Display(Name = "Given Name")]
public string GivenName { get; set; }
[Required]
[Display(Name = "Surname")]
public string Surname { get; set; }
[DataType(DataType.Date)]
[Display(Name = "Date of Birth")]
public DateTime DateOfBirth { get; set; }
}
私は以下を使用します
[DataType(DataType.Time)]
public TimeSpan StartTime { get; set; }
[DataType(DataType.Time)]
public TimeSpan EndTime { get; set; }
[DataType(DataType.Date)]
[Column(TypeName = "Date")]
public DateTime StartDate { get; set; }
[DataType(DataType.Date)]
[Column(TypeName = "Date")]
public DateTime EndDate { get; set; }
Entity Framework 6およびSQL Server Express 2012-11.0.2100.60(X64)を使用。それは完全に動作し、SQLサーバーで時刻/日付列タイプを生成します
クラスを属性で装飾したくない場合は、DbContext
のOnModelCreating
で次のように設定できます。
public class DatabaseContext: DbContext
{
// DbSet's
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// magic starts
modelBuilder.Entity<YourEntity>()
.Property(e => e.ReportDate)
.HasColumnType("date");
// magic ends
// ... other bindings
}
}
ColumnAttribute
を使用するほかに、DataTypeAttribute
のカスタム属性規則を作成することもできます。
public class DataTypePropertyAttributeConvention : AttributeConfigurationConvention<PropertyInfo, PrimitivePropertyConfiguration, DataTypeAttribute>
{
public override void Apply(PropertyInfo memberInfo, PrimitivePropertyConfiguration configuration, DataTypeAttribute attribute)
{
if (attribute.DataType == DataType.Date)
{
configuration.ColumnType = "Date";
}
}
}
OnModelCreatingメソッドに規則を登録するだけです:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}
これは、この質問に関する@ -LadislavMrnkaによる most-voted answer の単なる拡張機能です
Date
列がたくさんある場合は、カスタム属性を作成して、必要なときにいつでも使用できます。これにより、Entityクラスでよりクリーンなコードが生成されます
public class DateColumnAttribute : ColumnAttribute
{
public DateColumnAttribute()
{
TypeName = "date";
}
}
使用法
[DateColumn]
public DateTime DateProperty { get; set; }