EF Core继承模型仅扩展导航属性遇discriminator问题如何解决?
问题根因
你当前的实现触发了EF Core的默认TPH(表 per 层次结构)继承策略:当EF检测到模型中存在两个有继承关系的实体时,会自动要求添加Discriminator字段区分不同类型的实体,和你期望的「两个类映射同一张表全量数据」的需求冲突。
解决方案
不需要修改基础项目代码,只需调整扩展项目的配置,将基础项目的实体从扩展上下文的模型中排除即可,具体修改如下:
- 调整
ExtraCurricularContext的配置执行顺序,先执行基类上下文配置,再忽略基础项目的Person实体,最后配置扩展项目的自定义实体:
namespace ExtraCurricularProject.Contexts { public class ExtraCurricularContext : BaseContext { protected override void OnModelCreating(ModelBuilder modelBuilder) { // 先执行基础上下文的原有配置 base.OnModelCreating(modelBuilder); // 忽略基础项目的Person实体,避免EF识别继承关系 modelBuilder.Ignore<BaseProject.Models.Person>(); // 配置扩展项目的实体 new Person().OnModelCreating(modelBuilder); new ExtraCurricular().OnModelCreating(modelBuilder); new PersonExtraCurricular().OnModelCreating(modelBuilder); } } }
- 补全扩展项目
Person类的配置,手动指定映射到原表,仅新增导航属性的配置即可:
namespace ExtraCurricularProject.Models { public class Person : BaseProject.Models.Person { public ICollection<PersonExtraCurricular> PersonExtraCurriculars { get; set; } public void OnModelCreating(ModelBuilder modelBuilder) { var builder = modelBuilder.Entity<Person>(); // 映射到原Person表,和基础项目配置保持一致 builder.ToTable("Person", "dbo"); // 配置新增的导航属性 builder.HasMany(p => p.PersonExtraCurriculars) .WithOne(pec => pec.Person) .HasForeignKey(pec => pec.PersonId); } } }
生效逻辑
调整后EF仅会将扩展项目的Person类识别为映射dbo.Person表的唯一实体,不会感知到基础项目Person类的存在,自然不会触发继承相关的Discriminator校验。扩展的Person类继承了基础类的所有属性,会自动和表字段完成映射,不需要重复配置原有字段、主键、关联关系,完全符合你「不修改基础代码仅扩展关联」的需求。
内容的提问来源于stack exchange,提问作者MoMack20
相关产品推荐
相关产品推荐

