EF Core中TPC继承模式下多对多关系配置问题
EF Core TPC继承模式下实现子类与TestB的独立多对多关系
要实现每个子类(Child_A、Child_B)与TestB直接建立多对多关系并生成各自的关联表,需要调整实体类结构并在DbContext中明确配置TPC继承和多对多关系,具体步骤如下:
1. 修改实体类定义
把多对多关系从抽象父类移到各个子类中,同时更新TestB类的关联集合:
public class TestB { public int Id { get; set; } public string Name { get; set; } // 分别关联两个子类 public ICollection<Child_A> ChildAs { get; set; } public ICollection<Child_B> ChildBs { get; set; } } public abstract class ParentClass { public int Id { get; set; } public string Name { get; set; } // 移除父类中的TestBs集合,将关系下移到子类 } [Table("Child_A")] public class Child_A : ParentClass { public string ChildAName { get; set; } // 子类与TestB的多对多集合 public ICollection<TestB> TestBs { get; set; } } [Table("Child_B")] public class Child_B : ParentClass { public string ChildBName { get; set; } // 子类与TestB的多对多集合 public ICollection<TestB> TestBs { get; set; } }
2. 在DbContext中配置TPC继承和多对多关系
在你的DbContext子类中,通过Fluent API配置TPC继承策略,并分别定义每个子类与TestB的多对多关联表:
public class YourDbContext : DbContext { public DbSet<TestB> TestBs { get; set; } public DbSet<Child_A> ChildAs { get; set; } public DbSet<Child_B> ChildBs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 配置你的数据库连接字符串 optionsBuilder.UseSqlServer("YourConnectionString"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置TPC继承策略:父类不生成表,子类包含父类所有字段 modelBuilder.Entity<Child_A>() .HasBaseType<ParentClass>() .UseTpcMappingStrategy(); modelBuilder.Entity<Child_B>() .HasBaseType<ParentClass>() .UseTpcMappingStrategy(); // 配置Child_A与TestB的多对多关系,指定中间表为Child_ATestB modelBuilder.Entity<Child_A>() .HasMany(c => c.TestBs) .WithMany(t => t.ChildAs) .UsingEntity(j => j.ToTable("Child_ATestB")); // 配置Child_B与TestB的多对多关系,指定中间表为Child_BTestB modelBuilder.Entity<Child_B>() .HasMany(c => c.TestBs) .WithMany(t => t.ChildBs) .UsingEntity(j => j.ToTable("Child_BTestB")); } }
效果说明
执行迁移后,数据库会生成以下表:
TestB:存储TestB实体数据Child_A:存储Child_A实体数据(包含ParentClass的所有字段)Child_ATestB:Child_A与TestB的关联中间表Child_B:存储Child_B实体数据(包含ParentClass的所有字段)Child_BTestB:Child_B与TestB的关联中间表
内容的提问来源于stack exchange,提问作者Hani Safa
相关产品推荐
相关产品推荐

