当DateTime列可为空时,实体框架种子方法DateTime错误

时间:2014-05-05 16:40:50

标签: c# sql entity-framework datetime

我有以下POCO:

public class Specialty
{
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime? CreatedDate { get; set; }
    public string Description { get; set; }
    public string Id { get; set; }
    public string Name { get; set; }
}

在Configuration.cs的种子方法中,我有:

public override void Seed(MyContext context)
{
      context.Specialties.AddOrUpdate(p => p.Name,
                new Specialty { Id = Guid.NewGuid().ToString(), 
                                Description = "Allergy and Immunology", 
                                Name = "Allergy and Immunology" },
                new Specialty { Id = Guid.NewGuid().ToString(), 
                                Description = "Anaesthesiology",
                                Name = "Anaesthesiology" });
}

此表的迁移“命令”:

CreateTable("dbo.Specialty",
            c => new
                {
                    Id = c.String(nullable: false, maxLength: 128),
                    CreatedDate = c.DateTime(defaultValueSql: "GETDATE()"),
                    Description = c.String(),
                    Name = c.String(),
                })
            .PrimaryKey(t => t.Id);

因此,在Seed函数中,我故意遗漏了CreatedDate,因为我认为由于我的注释(数据库生成,计算)和迁移设置defaultValueSql: "GETDATE()",SQL会在插入时填充它。

我收到错误“将datetime2数据类型转换为日期时间数据类型会导致超出范围的值。”当我运行Update-Database时。据我所知,未在Seeding方法中指定CreatedDate将尝试将null CreatedDate保存到数据库中,这将被允许。看起来EF在我背后做了什么 - 什么?

我的猜测是EF强制DateTime.Now.Min或者SQL日期时间数据类型超出范围的东西......但是因为我已经指定了数据库生成,所以不应该阻止EF创建一个插入的超出范围值?

2 个答案:

答案 0 :(得分:1)

我相信这可以回答你的问题。 datetime2不允许DateTime.Min,但DateTime不允许。 DateTime.min值为00:00:00.0000000,0001年1月1日。

链接详情。

Conversion of a datetime2 data type to a datetime data type results out-of-range value

答案 1 :(得分:0)

以上,发布确实有效。但是,如果出现以下情况,我们将收到此错误:

  1. 我们可能错过了CreatedDate以外的非可空DateTime属性,但没有在Seed方法中指定。
  2. 非常容易忘记:如果您使用自定义属性创建自定义AspNet.Identity实体,您可能会在其中放置一个不可为空的DateTime属性,就像我的情况一样。