Entity Framework 6.1.3:如何通过Fluent API设置IsDeleted属性默认值
在EF 6.1.3中为IsDeleted设置默认值的解决方案
首先得明确一点:HasDefaultValue是EF Core才引入的API,EF 6.1.3完全不支持这个方法,这就是你调用它时遇到问题的原因。下面给你几个可行的方案,覆盖实体内存默认值和数据库层面默认值的双重需求:
方案1:构造函数+数据库默认值映射(推荐)
先在实体构造函数里设置内存中的默认值,确保你手动new出来的User实例,一开始IsDeleted就是false:
public class User { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public byte[] RowVersion { get; set; } public bool IsDeleted { get; set; } // 构造函数设置默认值 public User() { IsDeleted = false; } }
然后通过Fluent API配置数据库列的默认值,让Code First迁移生成的数据库列自带DEFAULT约束:
modelBuilder.Entity<User>() .Property(u => u.IsDeleted) .HasColumnAnnotation("DefaultValue", false);
生成并执行迁移后,数据库里的IsDeleted列会被设置为bit NOT NULL DEFAULT 0(对应C#的false),这样不管是通过EF插入还是直接操作数据库插入数据,都会有默认值。
如果你希望EF插入时不主动发送IsDeleted的值,完全依赖数据库默认值,可以再加上HasDatabaseGeneratedOption配置:
modelBuilder.Entity<User>() .Property(u => u.IsDeleted) .HasColumnAnnotation("DefaultValue", false) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
这样EF会认为这个值是数据库生成的,插入时不会传递IsDeleted参数,数据库自动用默认值,插入后EF还会从数据库读取这个值同步到实体。
方案2:属性初始化器(C# 6+)
如果你的项目用的是C# 6或更高版本(对应.NET Framework 4.6+),可以直接在属性声明时设置默认值,比构造函数更简洁:
public bool IsDeleted { get; set; } = false;
同样配合上面的Fluent API配置数据库默认值,就能同时满足内存和数据库层面的默认值需求。
关于构造函数未达预期的排查
你提到构造函数设置没效果,可能是这几种情况:
- 你是通过EF的
DbSet.Create()创建实体?放心,这个方法会调用实体构造函数,默认值应该生效; - 实体是通过反序列化(比如JSON转对象)生成的?这种情况不会走构造函数,这时候属性初始化器或者反序列化时手动设置会更靠谱;
- 迁移没执行,数据库列没有默认值?这时候直接操作数据库插入会出现NULL(如果列是NOT NULL的话会报错),但实体内存里的默认值还是有效的。
内容的提问来源于stack exchange,提问作者maciejka
相关产品推荐
相关产品推荐

