表从表的意外结果得出的核心视图

问题描述 投票:0回答:1

我有一个数据库视图,基于一个具有附加列的表。 我的课程首先看起来像这样:

public class Person { public int Id { get; set; } public string Name { get; set; } } public class PersonView { public int Id { get; set; } public string Name { get; set; } public string Additional { get; set; } }

在我的上下文中,我已经添加了这样的内容:

modelBuilder.Entity<Person>().ToTable("Person", "dbo"); modelBuilder.Entity<PersonView>().ToView("PersonView", "dbo");

这一切都按照预期的方式工作,我可以查询
Person

表或

ViewPerson
视图
ctx.Set<Person>().Where ....
ctx.Set<PersonView>().Where ....

现在,我尝试从表格中得出类的视图,仅将其扩展到其他属性。现在我的课看起来像这样:
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class PersonView : Person
{
    public string Additional { get; set; }
}

从这里,我在四处挣扎,导致离开上下文,查询到
ctx.Set<Person>().Where(..)
突然返回了

Person

ViewPerson
类型的混合。
,我将EF核心和处理层次结构介绍,阅读有关TPH,TPT和TPC的阅读,并了解到TPH是EF Core的默认值。
我认为,这不是我想要的,所以我在这种情况下改变了策略:

modelBuilder.Entity<Person>().UseTpcMappingStrategy().ToTable("Person", "dbo"); modelBuilder.Entity<PersonView>().ToView("PersonView", "dbo");

这确实使我的查询仅返回类型的对象,如果我查询表,但不幸的是,记录现在加倍了。

有人可以为我带来一些灯光吗?数据库已经存在,我只想查询表或视图,并且不希望它们之间进行任何交互,而是使用同一基类作为表和视图。

这是不可能的派生类,并且我有表格的类,并且在开始时就可以单独定义(这是在起作用的)。 thanks表示任何提示或链接到技巧!

当Gert Arnold指出我尝试了以下内容:

Person

我没有留下我的上下文:

public class PersonBase { public int Id { get; set; } public string Name { get; set; } } public class Person : PersonBase {} public class PersonView : PersonBase { public string Additional { get; set; } }

似乎工作了,我想知道为什么以及如何工作? :-)


将评论输入答案。问题在于EF知道类的继承(因为它都知道

modelBuilder.Entity<Person>().ToTable("Person", "dbo"); modelBuilder.Entity<PersonView>().ToView("PersonView", "dbo");
Person

),因此自动渗透了

临界映射
,默认情况下为TPH。但是,在这种情况下,您不希望EF映射任何继承。
解决方案是创建一个基类,例如

PersonView

,并从中得出
view entity-framework-core mapping hierarchy
1个回答
0
投票

Person

,而无需映射
PersonView
本身。
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.