如何在Entity Framework Core Fluent API中将基础实体配置重构为单独类
EF Core 6 全局配置EntityBase公共属性的两种实现方案
方案一:基于通用EntityTypeConfiguration基类实现(推荐优先使用)
这是符合你需求的EntityTypeConfiguration实现方案,通过泛型基类封装公共配置逻辑,子类继承即可复用:
第一步:定义通用基础配置类
public class EntityBaseConfiguration<T> : IEntityTypeConfiguration<T> where T : EntityBase { public virtual void Configure(EntityTypeBuilder<T> builder) { // 配置公共字段规则 builder.Property(x => x.CreatedByUserId) .HasMaxLength(Common.Constants.GuidColumnLength); builder.Property(x => x.ModifiedByUserId) .HasMaxLength(Common.Constants.GuidColumnLength); builder.Property(x => x.DateCreated) .HasColumnType(Common.DateConstants.SqlDataTypeColumn); builder.Property(x => x.DateModified) .HasColumnType(Common.DateConstants.SqlDataTypeColumn); // 额外建议:忽略领域事件字段,无需映射到数据库 builder.Ignore(x => x.DomainEvents); } }
第二步:具体实体配置类继承该基类
以Product实体为例(Product继承自EntityBase):
public class ProductConfiguration : EntityBaseConfiguration<Product> { public override void Configure(EntityTypeBuilder<Product> builder) { // 先执行父类的基础配置 base.Configure(builder); // 再写当前实体的专属配置逻辑 builder.Property(x => x.ProductName) .HasMaxLength(200) .IsRequired(); // 其他自定义配置... } }
第三步:批量注册所有配置
在DbContext的OnModelCreating方法中批量扫描注册所有配置类即可:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 扫描当前程序集下所有实现了IEntityTypeConfiguration的配置类 modelBuilder.ApplyConfigurationsFromAssembly(typeof(YourDbContext).Assembly); }
方案二:全局遍历实体统一配置(适合实体量大无需单独配置的场景)
如果你不想每个实体都写配置类,可以直接在你要重构的ConfigureBaseEntityProperties方法中统一处理所有继承EntityBase的实体:
private void ConfigureBaseEntityProperties(ModelBuilder modelBuilder) { // 筛选所有继承EntityBase的实体类型 var baseEntityTypes = modelBuilder.Model.GetEntityTypes() .Where(t => typeof(EntityBase).IsAssignableFrom(t.ClrType)); foreach (var entityType in baseEntityTypes) { var entityBuilder = modelBuilder.Entity(entityType.ClrType); // 批量配置公共属性 entityBuilder.Property(nameof(EntityBase.CreatedByUserId)) .HasMaxLength(Common.Constants.GuidColumnLength); entityBuilder.Property(nameof(EntityBase.ModifiedByUserId)) .HasMaxLength(Common.Constants.GuidColumnLength); entityBuilder.Property(nameof(EntityBase.DateCreated)) .HasColumnType(Common.DateConstants.SqlDataTypeColumn); entityBuilder.Property(nameof(EntityBase.DateModified)) .HasColumnType(Common.DateConstants.SqlDataTypeColumn); entityBuilder.Ignore(nameof(EntityBase.DomainEvents)); } }
然后直接在OnModelCreating中调用该方法即可:
protected override void OnModelCreating(ModelBuilder modelBuilder) { ConfigureBaseEntityProperties(modelBuilder); // 其他配置逻辑... }
方案对比
- 方案一结构清晰,符合单一职责原则,适合需要对每个实体做精细化配置的项目,灵活性更高,不需要基础配置的实体可以直接实现原生IEntityTypeConfiguration即可
- 方案二代码量更少,适合实体数量多、大部分实体仅需要基础配置的轻量项目
内容的提问来源于stack exchange,提问作者dinotom
相关产品推荐
相关产品推荐

