如何在EF代码优先4.3中使用CreatedDate列的数据库默认值?

Ric*_*ier 5 entity-framework ef-code-first entity-framework-4.3

我想CreatedDate在我的Accounts表中有一个列,定义如下:

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE()
Run Code Online (Sandbox Code Playgroud)

这将映射到类中的CreatedDate属性:

public class Account
{
    public DateTime? CreatedDate { get; private set; }
    // ... other properties ...
}
Run Code Online (Sandbox Code Playgroud)

在创建新帐户时,我想将CreatedDate设置为NULL,并让数据库填充它.当从DB加载现有帐户时,我希望EF检索数据库生成的CreatedDate.

我正在使用EF 4.3代码优先进行显式迁移.当EF为Accounts表生成迁移时,我将其修改如下:

CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试使用EF 4.3映射表时,EF会尝试在CreatedDate列中插入值NULL.

我尝试为该属性设置DatabaseGeneratedOption.Identity,如Ladislav Mrnka所建议的那样.但是,这会从主键属性中删除标识选项.我尝试使用DatabaseGeneratedOption.Computed,但它继续尝试插入NULL.我恢复了所有迁移并重新启动它们 - 问题仍然存在.

这是我正在做的事情OnModelCreating:

modelBuilder.Entity<Account>().Property(a => a.CreatedDate)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
Run Code Online (Sandbox Code Playgroud)

有没有人有什么建议?

谢谢你的帮助,
理查德

Lad*_*nka 4

使您的日期在实体中不可为空,或在数据库中不可为空。仅当插入语句不发送显式值时才使用数据库默认值。对于 EF,只有当您用 标记时才会发生这种CreatedDate情况DatabaseGeneratedOption.Identity。如果它从主键中删除默认身份,则强制通过数据注释或 Fluent API 手动执行。