You need to enable JavaScript to run this app. EF Code First 迁移中如何为基类属性配置全局SQL默认值
优惠活动
大模型
产品
解决方案
定价
更多

EF Code First 迁移中如何为基类属性配置全局SQL默认值

实现通用默认值配置的方案

完全不需要逐个修改迁移文件、也不需要为每个业务实体单独写配置。由于所有业务实体都继承自BaseSchema,完全可以在DbContext的模型构建阶段统一为基类属性配置SQL默认值规则,实现全局自动生效。

具体实现代码

重写DbContext的OnModelCreating方法,遍历所有已注册的实体,匹配到继承自BaseSchema的类型后,统一对基类属性做Fluent API配置:

// 针对EF6 场景的实现(匹配你当前使用的迁移语法)
public class BusinessDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        var baseType = typeof(BaseSchema);
        var deletedProp = baseType.GetProperty(nameof(BaseSchema.IsDeleted));
        var performedOnProp = baseType.GetProperty(nameof(BaseSchema.PerformedOn));

        // 遍历所有注册到模型的实体类型
        foreach (var entityMetadata in modelBuilder.Model.GetEntityTypes())
        {
            // 跳过所有没有继承BaseSchema的实体
            if (!baseType.IsAssignableFrom(entityMetadata.GetClrType()))
            {
                continue;
            }

            // 为IsDeleted字段配置SQL默认值0
            modelBuilder.Entity(entityMetadata.GetClrType())
                .Property(deletedProp)
                .HasDefaultValueSql("0");
            
            // 为PerformedOn字段配置SQL默认值GETDATE()
            modelBuilder.Entity(entityMetadata.GetClrType())
                .Property(performedOnProp)
                .HasDefaultValueSql("GETDATE()");
        }
    }

    // 原有DbSet定义保持不变即可
    public DbSet<HoodAudit> HoodAudits { get; set; }
}

如果项目使用的是EF Core版本,只要稍微调整下模型遍历的写法即可,核心配置逻辑完全一致:

// 针对EF Core场景的适配写法
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    var baseType = typeof(BaseSchema);
    var targetEntities = modelBuilder.Model.GetEntityTypes()
        .Where(type => baseType.IsAssignableFrom(type.ClrType));

    foreach (var entity in targetEntities)
    {
        modelBuilder.Entity(entity.ClrType)
            .Property(nameof(BaseSchema.IsDeleted))
            .HasDefaultValueSql("0");
        
        modelBuilder.Entity(entity.ClrType)
            .Property(nameof(BaseSchema.PerformedOn))
            .HasDefaultValueSql("GETDATE()");
    }
}

配置生效后的实际效果

完成配置后重新执行Add-Migration命令,生成的建表逻辑会自动带上你要求的默认值配置,全程不需要手动修改迁移文件:

CreateTable(
    "dbo.HoodAudits",
    c => new
        {
            Id = c.Int(nullable: false, identity: true),
            IsDeleted = c.Boolean(nullable: false, defaultValueSql: "0"),
            PerformedOn = c.DateTime(nullable: false, defaultValueSql: "GETDATE()"),
        },

方案优势

  • 全量自动覆盖:后续新增任何继承BaseSchema的业务实体,只要将实体注册到DbContext,就会自动应用这套默认值规则,不需要重复写配置代码
  • 统一可维护:如果后续要调整默认值逻辑(比如将GETDATE()换成SYSUTCDATETIME()),只需要修改一处配置,所有实体的迁移规则会同步更新
  • 无侵入性:不需要修改原有业务实体的代码,完全和现有实体结构兼容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 07:36:07