EF Core视图继承表实体类引发查询异常的问题求助
问题回顾
最初分开定义Person和PersonView实体时,EF Core将它们视为完全独立的两个实体,分别映射到数据库表Person和视图PersonView,查询逻辑正常。
当让PersonView继承Person后,EF Core默认启用**TPH(表层次结构)**继承策略,会将Person和PersonView归为同一继承层次的实体,查询ctx.Set<Person>()时会自动拉取所有派生类型的数据,导致结果出现混合类型。
改用**TPC(表每Concrete类型)**策略后,虽然解决了类型混合问题,但由于TPC要求每个实体对应独立的数据库结构,而视图PersonView与表Person存在字段重叠(Id、Name),EF Core处理时出现了重复记录。
公共基类方案可行的核心原因
打破EF Core的继承层次识别
当使用PersonBase作为公共基类时,Person和PersonView是平级的独立实体,而非继承体系中的基类与派生类。EF Core不会将它们归为同一继承层次,只会将PersonBase视为承载共享属性的抽象基类(默认不映射到数据库),不会触发任何继承映射策略(TPH/TPC/TPT)。实体映射完全独立
此时modelBuilder中对两个实体的配置完全独立:modelBuilder.Entity<Person>().ToTable("Person", "dbo"); modelBuilder.Entity<PersonView>().ToView("PersonView", "dbo");EF Core会将它们当作毫无关联的实体处理,查询
ctx.Set<Person>()仅返回表中数据,查询ctx.Set<PersonView>()仅返回视图数据,不会出现类型混合或重复记录。兼顾代码复用与实体隔离
公共基类既实现了Id、Name等共享属性的代码复用,又避免了实体继承导致EF Core误判为继承结构的问题,完美匹配了你"独立查询表或视图、仅复用相同基类且二者无关联"的需求。
内容的提问来源于stack exchange,提问作者Helmut

