使EF将继承层次结构视为完全独立的实体

时间:2014-04-14 02:31:25

标签: entity-framework inheritance ef-code-first

默认情况下,

Entity Framework 6 在满足继承时会创建一个特殊的实体层次结构,其中包含TPH,TPT或TPC。但我希望EF将我的课程视为完全独立的实体

我有以下类层次结构,其中每个类都映射到DB中的视图

[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")

但是EF坚持要添加鉴别器列并严重扭曲查询。并且似乎没有办法让EF忘记这些类具有继承层次结构!

将鉴别器列添加到视图并切换到TPC没有帮助,因为查询中出现了大量UNION个。似乎我唯一的选择是修改EF源代码,如果我想坚持我的继承方法。有没有更简单的解决方案?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果不映射基础实体,则忽略继承。所以这是你可以做的一个技巧:

为您的Item课程创建一个基类,并提升所有成员。我们称之为ItemBase。不要映射此类,也不要将其添加到DbContext

然后Item将是一个没有任何属性的映射类(将继承基类中的所有内容)。使其余的类(如ItemWithDescription)也扩展ItemBase

这样,您将重新使用代码,但会丢失Item及其子代之间的继承关系,这取决于您的情况,可能会也可能不会被接受。