EF Core 2.0代码优先迁移:为所有实体公共属性设默认值
统一配置所有继承BaseEntity的实体默认值
嗨,这个场景太常见了,不用每个实体都重复写一遍配置,咱们可以借助EF Core 2.0的模型遍历能力,一次性给所有继承自BaseEntity的实体统一设置默认值,省心又高效!
实现步骤
在你的DbContext的OnModelCreating方法里,我们可以先筛选出所有继承BaseEntity的实体类型,然后循环配置三个公共属性的默认值:
class MyContext : DbContext { public DbSet<CaseDetails> CaseDetails { get; set; } // 其他实体的DbSet定义... protected override void OnModelCreating(ModelBuilder modelBuilder) { // 遍历所有继承自BaseEntity的实体类型 var baseEntityTypes = modelBuilder.Model.GetEntityTypes() .Where(t => t.ClrType.IsSubclassOf(typeof(BaseEntity))); foreach (var entityType in baseEntityTypes) { // 配置CreateDate默认值为当前UTC时间 modelBuilder.Entity(entityType.ClrType) .Property(nameof(BaseEntity.CreateDate)) .HasDefaultValueSql("getutcdate()"); // 配置CreateBy默认值为"System" modelBuilder.Entity(entityType.ClrType) .Property(nameof(BaseEntity.CreateBy)) .HasDefaultValue("System"); // 配置IsDeleted默认值为false(对应数据库的0) modelBuilder.Entity(entityType.ClrType) .Property(nameof(BaseEntity.IsDeleted)) .HasDefaultValue(false); } // 这里可以放单个实体的特殊配置(如果有的话) } }
关键说明
- 避免硬编码属性名:用
nameof(BaseEntity.CreateDate)代替字符串,这样属性名修改时编译器会自动提示,减少出错概率 - 修正IsDeleted的默认值:你之前写的
"0()"是错误的,因为IsDeleted是bool类型,直接赋值false即可,SQL Server会自动将其映射为0 - 兼容抽象基类:如果你的
BaseEntity是抽象类,这个方法依然有效,IsSubclassOf会正确识别所有派生实体
这样一来,不管后续新增多少个继承BaseEntity的实体,都不用再手动配置这三个属性的默认值啦!
内容的提问来源于stack exchange,提问作者Mukil Deepthi
相关产品推荐
相关产品推荐

