Entity framework 使EF将继承层次结构视为完全独立的实体
实体框架6默认情况下,当它满足继承要求时,会创建一个具有TPH、TPT或TPC的特殊实体层次结构。但我希望EF将我的类视为完全独立的实体 我有以下类层次结构,其中每个类都映射到数据库中的视图:Entity framework 使EF将继承层次结构视为完全独立的实体,entity-framework,inheritance,ef-code-first,Entity Framework,Inheritance,Ef Code First,实体框架6默认情况下,当它满足继承要求时,会创建一个具有TPH、TPT或TPC的特殊实体层次结构。但我希望EF将我的类视为完全独立的实体 我有以下类层次结构,其中每个类都映射到数据库中的视图: [Table("v_Item")] class Item { [Key] public int ID { get; set; } public string Name { get; set; } } [Table("v_ItemWithDescription")] class I
[Table("v_Item")]
class Item
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
}
[Table("v_ItemWithDescription")]
class ItemWithDescription : Item
{
public string Description { get; set; }
}
这种设计可以在需要时获得更详细的信息。而且天气很干燥。还可以强制转换IQueryable
:
IQueryable<ItemWithDescription> query = ...;
((IQueryable<Item>) query).Where(i => i.Name == "Foo")
IQueryable查询=。。。;
((IQueryable)查询)。其中(i=>i.Name==“Foo”)
但EF坚持添加鉴别器列,严重扭曲了查询。而且似乎没有办法让EF忘记这些类具有继承层次结构
将鉴别器列添加到视图并切换到TPC并没有帮助,因为在查询中会出现大量的UNION
s。如果我想坚持我继承的方法,我唯一的选择就是修改EF源代码。有没有更简单的解决方案
提前谢谢 如果不映射基本实体,它将忽略继承。所以这里有一个技巧你可以做到: 为您的
项目创建一个基类
类,并向上拉所有成员。让我们称之为ItemBase
。不要映射此类,也不要将其添加到DbContext
然后,Item
将是一个映射类,没有自己的任何属性(将继承基类的所有内容)。让其余的类(如ItemWithDescription
)也扩展ItemBase
这样,您可以重复使用代码,但会丢失
项
及其子项之间的继承关系,这取决于您的情况,可能是可接受的,也可能是不可接受的。非常感谢!这是一个几乎完美的解决方案,适合我的需要,非常聪明的技巧,既可以获得代码重用,又可以放弃固有性。我当然更希望继承时EF忽略它,也许有一天我会重新访问这段代码。