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

本文关键字:日期 字段 创建 框架 代码 实体 | 更新日期: 2023-09-27 17:50:00

我使用实体框架代码第一方法来创建我的数据库表。下面的代码在数据库中创建一个DATETIME列,但我想创建一个DATE列。

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

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

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

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

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

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基类来完成任务。

我使用下列

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

With Entity Framework 6 &SQL Server Express 2012 - 11.0.2100.60 (X64)。
它可以完美地在SQL server中生成时间/日期列类型

如果您不喜欢用属性来装饰您的类,您可以在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
    }
}

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

除了使用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对这个问题的最多投票的答案的增强

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

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

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

EF Core 5 + PostgreSQL:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
public class Birthday
{
    [Key]
    public int Id { get; set; }
    
    [Column(TypeName = "date")]
    public DateTime DateOfBirth { get; set; }
}

参见列数据类型

最佳使用方式

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

但是你必须使用EntityFramework v 6.1.1