实体框架6代码插入时的第一个默认日期时间值

时间:2013-06-11 15:34:08

标签: c# .net sql entity-framework

当我保存对数据库的更改时,我遇到了以下异常:

Cannot insert the value NULL into column 'Registered', table
'EIT.Enterprise.KMS.dbo.LicenseEntry'; column does not allow nulls.
INSERT fails. The statement has been terminated.

相关代码第一个模型属性如下所示:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime         Registered          { get; private set; }

...这就是为什么我感到困惑:据我所知,通过提供注释[DatabaseGenerated(DatabaseGeneratedOption.Identity)我命令实体框架自动生成字段(在这种情况下:创建时只有一次)时间。)

所以我希望有一个不可为空(必需)的字段,而不可能在EF处理的情况下手动改变字段。

我做错了什么?


注意:

  1. 我不想使用Fluent-API,因为我想使用POCO。
  2. 属性defaultValueSql也不是一个选项,因为我需要依赖此项目的数据库(例如GETDATE())。
  3. 我正在使用Entity Framework 6 alpha 3,Code First。

4 个答案:

答案 0 :(得分:3)

试试这个:

[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime?            Registered          { get; private set; }

问号使属性可以为空

答案 1 :(得分:2)

此技术的行为类似于持久保存到数据库的readonly字段。一旦设置了值,就不能(轻松)使用代码更改它。 (当然,如果需要,您可以将设置器更改为publicinternal。)

当您创建使用此代码的类的新实例时,最初不会设置Registered。第一次请求Registered的值时,它会看到它尚未分配一个,然后默认为DateTime.Now。如果需要,您可以将其更改为DateTime.UTCNow

从数据库中提取一个或多个实体时,实体框架将设置Registered的值,包括private这样的设置者。

private DateTime? registered;
[Required]
public DateTime Registered
{
    get
    {
        if (registered == null)
        {
            registered = DateTime.Now;
        }
        return registered.Value;
    }
    private set { registered = value; }
}

答案 2 :(得分:1)

没有默认的DateTime。只有min value

您可能只需在调用dbContext.SaveChanges之前在该实体上设置日期时间。

See this for a solution.

答案 3 :(得分:0)

我所做的是将值设置为可选且可为空。我使用了数据注释,但也可以在Fluent Api中使用IsOptional:

        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
        public DateTime? UpdatedAt { get; set; }

然后我创建了另一个Sql迁移,以将值更改为默认值:

    public partial class AlterTableUpdatedAtDefault : DbMigration
    {
        public override void Up()
        {
            Sql(@"ALTER TABLE dbo.[Table]
                  ADD CONSTRAINT DF_Table_UpdatedAt
                  DEFAULT getdate() FOR UpdatedAt");
        }

        public override void Down()
        {
            Sql(@"ALTER TABLE dbo.[Table]
                  drop CONSTRAINT DF_Table_UpdatedAt");
        }
    }