Entity framework 如何在EF code first 4.3中为CreatedDate列使用数据库默认值?

Entity framework 如何在EF code first 4.3中为CreatedDate列使用数据库默认值?,entity-framework,ef-code-first,entity-framework-4.3,Entity Framework,Ef Code First,Entity Framework 4.3,我希望在我的Accounts表中有一个CreatedDate列,定义如下: CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE() CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"), 这将映射到类中的CreatedDate属性: public class Account { public DateTime? CreatedDate { ge

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

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE()
CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),
这将映射到类中的CreatedDate属性:

public class Account
{
    public DateTime? CreatedDate { get; private set; }
    // ... other properties ...
}
创建新帐户时,我希望将CreatedDate设置为NULL,并让数据库填充它。从DB加载现有帐户时,我希望EF检索生成的CreatedDate数据库

我首先使用EF4.3代码进行显式迁移。当EF为Accounts表生成迁移时,我对其进行了如下修改:

CreatedDate DATETIME NOT NULL DEFAULT GETUTCDATE()
CreatedDate = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),
不幸的是,当我尝试使用EF 4.3映射表时,EF试图在CreatedDate列中插入NULL值

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

下面是我在模型创建中所做的工作:

modelBuilder.Entity<Account>().Property(a => a.CreatedDate)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
modelBuilder.Entity().Property(a=>a.CreatedDate)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
有人有什么建议吗

谢谢你的帮助,

Richard

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

谢谢Ladislav!它起作用了。我用DatabaseGenerateOption.Identity标记了CreatedDate和我的ID列。我让它在我的实体中为NULL,在DB中为non-NULL——但是使用Identity选项,它不再插入显式NULL。