我有一个数据库视图,基于一个具有附加列的表。 我的课程首先看起来像这样:
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