EF Core Fluent API 配置A、B类关联C类列表生成两张独立关联表
实现方案
EF Core 5.0及以上版本支持从属(Owned)实体集合单独映射表,你的需求可以通过将C配置为A、B的从属实体实现。
第一步:修正原模型的小问题
原模型存在属性访问级别、类型不匹配的小问题,先调整为可被EF Core识别的版本:
public class C { public int SomeData {get;set;} public int SomeOtherData {get;set;} } public abstract class ABAbstract { // 改为公共属性才能被EF Core识别映射 public List<C> Data {get;set;} = new(); } public class A: ABAbstract { // 按需求设置字符串类型主键 public string Id {get;set;} public string Name {get;set;} } public class B: ABAbstract { // 修正类型为int public int Id {get;set;} }
第二步:Fluent API配置
在你的DbContext的OnModelCreating方法中添加如下配置:
public class YourDbContext : DbContext { public DbSet<A> As { get; set; } public DbSet<B> Bs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置A的主键 modelBuilder.Entity<A>() .HasKey(a => a.Id); // 配置A关联的C集合映射到独立表A_C modelBuilder.Entity<A>() .OwnsMany(a => a.Data, d => { d.ToTable("A_C"); // 可自定义外键列名,默认会生成AId d.WithOwner().HasForeignKey("OwnerId"); // 配置A_C表的联合主键 d.HasKey("OwnerId", "Id"); }); // 配置B的主键 modelBuilder.Entity<B>() .HasKey(b => b.Id); // 配置B关联的C集合映射到独立表B_C modelBuilder.Entity<B>() .OwnsMany(b => b.Data, d => { d.ToTable("B_C"); d.WithOwner().HasForeignKey("OwnerId"); d.HasKey("OwnerId", "Id"); }); // 显式忽略抽象基类和C类,避免生成独立表 modelBuilder.Ignore<ABAbstract>(); modelBuilder.Ignore<C>(); } }
配置说明
OwnsMany方法将C定义为A、B的从属实体,C本身不会被映射为独立数据库表- 分别给两个从属集合配置不同的
ToTable参数,即可生成独立的A_C、B_C关联表 - A_C表的外键为字符串类型,匹配A的主键;B_C表的外键为int类型,匹配B的主键,完全符合需求
内容的提问来源于stack exchange,提问作者raiserle
相关产品推荐
相关产品推荐

