EF6中datetime2字段默认值设置不生效问题咨询
解决EF6 Code First中CreatedDate默认值未生效问题
我之前踩过这个一模一样的坑,马上给你理清楚问题原因和解决办法!
问题根源
你用的[DefaultValue("getutcdate()")]特性其实是给Visual Studio的设计器用的——它只是在设计界面里给字段显示一个默认值,完全不是用来告诉数据库设置默认约束的。所以哪怕EF生成了表,数据库列也不会自动把getutcdate()设为默认值;就算你手动在数据库加了默认约束,EF在插入数据时,因为CreatedDate是DateTime类型(非可空),它会自动把字段值设为DateTime.MinValue(也就是你看到的0001-01-01 00:00:00.0000000)并传给数据库,直接覆盖了数据库的默认规则。
两种有效解决方案
方案一:数据库端生成默认值(推荐)
这是最靠谱的方式,让数据库负责生成UTC时间,同时告诉EF不要干预这个字段的赋值:
- 在你的
DbContext的OnModelCreating方法里,用Fluent API配置字段:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<YourEntityName>() // 指定数据库默认值为getutcdate() .Property(e => e.CreatedDate) .HasDefaultValueSql("getutcdate()") // 告诉EF这个值由数据库生成,插入时不要传递值 .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // 其他实体配置... }
- 生成并执行迁移脚本(如果用Code First迁移),或者手动更新数据库表结构,确保
CreatedDate列的默认约束已经加上。
方案二:客户端生成默认值
如果你的场景允许在代码里生成UTC时间,也可以在实体构造函数里直接赋值:
public class YourEntityName { public YourEntityName() { // 实例化时自动设置当前UTC时间 CreatedDate = DateTime.UtcNow; } public DateTime CreatedDate { get; set; } // 其他实体属性... }
这种方式的缺点是时间由应用服务器生成,和数据库服务器时间可能有细微偏差,根据你的业务需求选择即可。
额外排查点
如果配置完还是没生效,去数据库里检查CreatedDate列的默认约束是否存在:比如在SQL Server中,右键表→设计→查看该列的“默认值或绑定”是否为getutcdate()。如果之前的迁移没生成这个约束,你需要重新生成迁移并执行,或者手动修改数据库。
内容的提问来源于stack exchange,提问作者Abbas
相关产品推荐
相关产品推荐

