entity framework代码第一个date字段创build

我正在使用entity framework代码优先方法来创build我的数据库表。 下面的代码在数据库中创build一个DATETIME列,但是我想创build一个DATE列。

 [DataType(DataType.Date)] [DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] public DateTime ReportDate { get; set; } 

如何在创build表格时创buildDATEtypes的列?

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

这与Tyler Durden的方法具有相同的结果,只不过它使用EF基类作为工作。

尝试从System.ComponentModel.DataAnnotations (在EntityFramework.dll中定义)使用ColumnAttribute

 [Column(TypeName="Date")] public DateTime ReportDate { get; set; } 

我发现这在EF6很好的作品。

我创build了一个指定我的数据types的约定。 此约定将数据库创build中的默认DateTime数据types从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.... } 

将该属性添加到您希望仅作为date的任何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; } } 

除了使用ColumnAttribute您还可以为DataTypeAttribute创build一个自定义属性约定:

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

我使用以下

  [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 Server中生成时间/date列types

如果你不想用属性装饰你的类,你可以在DbContextOnModelCreating这样设置:

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

这仅仅是@LadislavMrnka在这个问题上得到最多人赞同的答案的增强

如果您有很多Date列,那么您可以创build自定义属性,然后在需要时使用它,这将在实体类中生成更干净的代码

 public class DateColumnAttribute : ColumnAttribute { public DateColumnAttribute() { TypeName = "date"; } } 

用法

 [DateColumn] public DateTime DateProperty { get; set; } 

它使用的最佳方式

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

但是您必须使用EntityFramework v 6.1.1