EF Core中如何将SubEntity映射至两个对应子实体的数据表?
解决方案
要实现<SubEntity>分别映射到<table-child1-se>和<table-child2-se>,核心是利用EF Core的**拥有实体(Owned Entity)**特性——因为<SubEntity>是依附于父实体的从属对象,每个父实体子类可以为其指定独立的存储表。具体步骤如下:
1. 移除全局SubEntityConfiguration
原有的全局配置会强制<SubEntity>映射到单一表,不符合需求,直接删除该类即可。
2. 为每个子类单独配置关联表
分别在<Child1>和<Child2>的实体配置中,指定其<SE>导航属性对应的存储表。
方式一:使用配置类
// Child1的实体配置 class Child1Configuration : IEntityTypeConfiguration<Child1> { public void Configure(EntityTypeBuilder<Child1> builder) { builder.ToTable("table-child1"); // 配置SE为拥有实体,并指定对应表名 builder.OwnsOne(child => child.SE, seBuilder => { seBuilder.ToTable("table-child1-se"); // 若SubEntity有属性,可在此单独配置字段映射,例如: // seBuilder.Property(se => se.PropertyName).HasColumnName("column_name"); }); } } // Child2的实体配置 class Child2Configuration : IEntityTypeConfiguration<Child2> { public void Configure(EntityTypeBuilder<Child2> builder) { builder.ToTable("table-child2"); builder.OwnsOne(child => child.SE, seBuilder => { seBuilder.ToTable("table-child2-se"); }); } }
方式二:直接在DbContext中配置
如果不想创建单独的配置类,可在DbContext的OnModelCreating方法中直接配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Child1及其关联的SubEntity表 modelBuilder.Entity<Child1>(builder => { builder.ToTable("table-child1"); builder.OwnsOne(c => c.SE, se => se.ToTable("table-child1-se")); }); // 配置Child2及其关联的SubEntity表 modelBuilder.Entity<Child2>(builder => { builder.ToTable("table-child2"); builder.OwnsOne(c => c.SE, se => se.ToTable("table-child2-se")); }); }
原理说明
通过OwnsOne配置后,<SubEntity>会被视为对应父实体的从属对象,两个子类的<SE>数据会分别存储到各自指定的表中,表内会自动生成父实体的外键来关联数据,实现数据的隔离存储。
内容的提问来源于stack exchange,提问作者Sébastien
相关产品推荐
相关产品推荐

