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

时间:2012-05-23 00:03:02

标签: entity-framework ef-code-first entity-framework-4.3

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

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE()

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

public class Account
{
    public DateTime? CreatedDate { get; private set; }
    // ... other properties ...
}

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

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

CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),

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

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

以下是我在OnModelCreating中所做的事情:

modelBuilder.Entity<Account>().Property(a => a.CreatedDate)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

有人有任何建议吗?

感谢您的帮助,
理查德

1 个答案:

答案 0 :(得分:4)

使您的日期在您的实体中不可为空,或在您的数据库中为空。仅当insert语句未发送显式值时,才使用数据库缺省值。对于EF,仅当您使用CreatedDate标记DatabaseGeneratedOption.Identity时才会出现这种情况。如果它从主键中删除默认标识,则会通过数据注释或流畅的API手动强制它。