5

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

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE()

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

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

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

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

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

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

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

这是我正在做的事情OnModelCreating

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

有没有人有什么建议?

谢谢你的帮助,
理查德

4

1 回答 1

4

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

于 2012-05-23T07:26:49.960 回答