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
相关产品推荐
相关产品推荐

