Entity Framework 6 Code First 插入默认日期时间值

6
当我保存更改到数据库时,遇到以下异常:
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.

相关的Code First模型属性如下所示:
[DatabaseGenerated(DatabaseGeneratedOption.Identity), DataMember]
public DateTime         Registered          { get; private set; }

我很困惑,因为据我所知,通过提供注释[DatabaseGenerated(DatabaseGeneratedOption.Identity),我要求Entity Framework自动生成该字段(在此情况下:仅在创建时生成一次)。因此,我预期会有一个非空的(必需的)字段,无法手动更改该字段,由EF来处理。
那么我做错了什么呢?
注意: 1. 我不想使用Fluent-API,因为我想要使用POCOs。 2. 属性defaultValueSql也不是一个选项,因为我需要对这个项目进行独立于数据库的依赖(例如GETDATE())。 3. 我正在使用Entity Framework 6 alpha 3,Code First。

AutoGenerate是否也是您的主键?如果是,您需要指定[key]注释。 - Botonomous
不,这只是一个属性。 - Atrotygma
1
我不认为DateTime数据类型支持身份字段属性。 - marcellscarlett
4个回答

3

试试这个:

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

问号使属性可为空。

我尝试了你的解决方案,但似乎并没有起作用,尽管它应该可以。每当我生成迁移脚本时,该字段在脚本中被标记为“nullable: false”。即使在数据库创建时也是如此。可能出了什么问题?是私有设置吗? - Atrotygma

2
该技术类似于持久化到数据库的只读字段。一旦设置了值,代码就不能(轻松地)更改它。 (当然,如果需要,可以将setter更改为public或internal。)
当您创建使用此代码的类的新实例时,Registered不会被初始设置。第一次请求Registered时,它会看到它尚未分配一个值,然后默认为DateTime.Now。如果需要,您可以将其更改为DateTime.UTCNow。
从数据库获取一个或多个实体时,Entity Framework将设置Registered的值,包括像这样的private setters。
private DateTime? registered;
[Required]
public DateTime Registered
{
    get
    {
        if (registered == null)
        {
            registered = DateTime.Now;
        }
        return registered.Value;
    }
    private set { registered = value; }
}

2

没有默认的 DateTime。只有一个最小值 min value

在调用 dbContext.SaveChanges 之前,您可以将该实体的 datetime 设置为这个最小值。

查看此解决方案。


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");
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接