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表格时创buildDATE
types的列?
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
如果你不想用属性装饰你的类,你可以在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 } }
这仅仅是@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