Entity Framework 6 Core 如何通过多列关联实现共享维基百科页表引用
结论
完全可以通过 EF Code First 的 ModelBuilder 配置实现该需求,无需额外创建数据表,仅复用单张 WikipediaDomain 表即可完成国家、城市两类实体和维基页面的关联。
具体实现步骤
1. 定义实体类型枚举(可选,推荐使用提升代码可读性)
public enum EntityTypeEnum { Country = 1, City = 2 }
2. 在 DbContext 的 OnModelCreating 方法中配置关联规则
以 EF Core 为例,配置代码如下:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置国家实体和维基页面的一对多关系 modelBuilder.Entity<CountryDomain>() .HasMany(c => c.WikipediaPages) .WithOne() // WikipediaDomain 不需要反向导航到 CountryDomain,留空即可 .HasForeignKey(w => w.EntityId) .HasPrincipalKey(c => c.Id) .OnDelete(DeleteBehavior.Cascade); // 可按需调整删除行为,比如设为 Restrict // 配置城市实体和维基页面的一对多关系 modelBuilder.Entity<CityDomain>() .HasMany(c => c.WikipediaPages) .WithOne() .HasForeignKey(w => w.EntityId) .HasPrincipalKey(c => c.Id) .OnDelete(DeleteBehavior.Cascade); // 可选:添加全局查询过滤器,查询时自动匹配对应实体类型的维基页面 modelBuilder.Entity<WikipediaDomain>() .HasQueryFilter(w => (w.EntityType == (int)EntityTypeEnum.Country && EF.Property<CountryDomain>(w, "CountryDomain") != null) || (w.EntityType == (int)EntityTypeEnum.City && EF.Property<CityDomain>(w, "CityDomain") != null)); }
3. 自动填充EntityType字段(可选,避免手动赋值出错)
重写 DbContext 的 SaveChanges 方法,新增维基页面记录时自动根据关联的实体类型赋值 EntityType:
public override int SaveChanges() { var addedWikiEntries = ChangeTracker.Entries<WikipediaDomain>() .Where(e => e.State == EntityState.Added); foreach (var entry in addedWikiEntries) { // 判断当前关联的实体是国家还是城市,自动赋值类型 var countryRef = entry.Reference<CountryDomain>("CountryDomain"); if (countryRef?.CurrentValue != null) { entry.Entity.EntityType = (int)EntityTypeEnum.Country; continue; } var cityRef = entry.Reference<CityDomain>("CityDomain"); if (cityRef?.CurrentValue != null) { entry.Entity.EntityType = (int)EntityTypeEnum.City; } } return base.SaveChanges(); }
注意事项
- 如果使用的是 EF6 版本,不支持全局查询过滤器,查询对应实体的维基页面时需要手动加
Where(w => w.EntityType == 对应类型值)的过滤条件 - 不需要在
WikipediaDomain类中添加指向CountryDomain或CityDomain的反向导航属性,避免关联冲突 - 新增维基页面时如果手动赋值
EntityType,需要确保值和关联的实体类型一致,否则会出现查询不到关联数据的问题
内容的提问来源于stack exchange,提问作者NLAnaconda
相关产品推荐
相关产品推荐

