Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使EF将继承层次结构视为完全独立的实体_Entity Framework_Inheritance_Ef Code First - Fatal编程技术网

Entity framework 使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

实体框架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 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忽略它,也许有一天我会重新访问这段代码。