You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        }

        // 这里可以放单个实体的特殊配置(如果有的话)
    } 
}

关键说明

  1. 避免硬编码属性名:用nameof(BaseEntity.CreateDate)代替字符串,这样属性名修改时编译器会自动提示,减少出错概率
  2. 修正IsDeleted的默认值:你之前写的"0()"是错误的,因为IsDeleted是bool类型,直接赋值false即可,SQL Server会自动将其映射为0
  3. 兼容抽象基类:如果你的BaseEntity是抽象类,这个方法依然有效,IsSubclassOf会正确识别所有派生实体

这样一来,不管后续新增多少个继承BaseEntity的实体,都不用再手动配置这三个属性的默认值啦!

内容的提问来源于stack exchange,提问作者Mukil Deepthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:51:13