实体框架代码第一个日期字段创建

时间:2011-04-14 03:30:57

标签: entity-framework code-first entity-framework-4.1

我正在使用Entity Framework Code First方法来创建我的数据库表。以下代码 在数据库中创建DATETIME列,但我想创建一个DATE列。

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

如何在创建表格时创建DATE类型的列?

9 个答案:

答案 0 :(得分:145)

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

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

答案 1 :(得分:20)

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基类来完成这项工作。

答案 2 :(得分:7)

我发现这很适合在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; }
}

答案 3 :(得分:6)

我使用以下

h[2] ||= [] << 1

使用Entity Framework 6&amp; SQL Server Express 2012 - 11.0.2100.60(X64)。它完美地工作并在sql server

中生成时间/日期列类型

答案 4 :(得分:4)

除了使用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());
}

答案 5 :(得分:4)

如果您不想使用属性装饰您的类,可以在DbContext的{​​{1}}中进行设置,如下所示:

OnModelCreating

答案 6 :(得分:3)

这只是@LadislavMrnka在此问题上most up-voted answer的增强

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

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

<强>用法

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

答案 7 :(得分:0)

这适用于 EF Core 5 + PostgreSQL:

                        var                            index          date
[1]04/04/2004[2]02/10/2002[3]2/02/2002[4]01/01/2001       3     2004-04-04
[1][2][3][4][5]05/30/2021[6]04/34/2020                   11     2021-05-30

column data types

答案 8 :(得分:-2)

使用

的最佳方式
[DataType(DataType.Date)]
public DateTime ReportDate { get; set; }

但您必须使用 EntityFramework v 6.1.1