如何在Entity Framework中仅加载基类型

Dee*_*ain 4 c# entity-framework entity-framework-4 entity-framework-4.1

考虑以下案例:

我有另外两个继承的基类.例如,我们将:

class Base
{

}
class DerivedA : Base
{

}
class DerivedB : Base
{

}
Run Code Online (Sandbox Code Playgroud)

当我向代码请求基本实体时

context.Base.Where(q => q.Id == id).first();

实体框架为每个派生实体生成一组完整的连接,这导致低于可接受的查询性能.什么我要的是只加载基础机构没有它加入到衍生的.

我在这里找到的唯一解决方案是http://blogs.msdn.com/b/alexj/archive/2009/09/17/tip-35-how-to-write-oftypeonly-tentity.aspx.但这对我不起作用.EF仍会产生巨大的查询.

编写如下查询:

context.Base.Where(q => !(q is DerivedA) && !(q is DerivedB)).First();
Run Code Online (Sandbox Code Playgroud)

由于衍生类型的数量不断增加,也不适合我.

除了我提到的那些之外,有没有可能的解决方案?

Lad*_*nka 5

您正在使用Table-per-type => EF必须生成这些连接,因为它不知道您的实体究竟是什么类型.如果您的记录来自表中Base的相关记录,那么IT不得为该记录创建实体实例- IT必须创建实例,并且需要进行连接才能获得这些知识.DerivedABaseDerivedA

长期讨论为什么不允许这样做,而只是实体来自对象世界 - 它是原子数据结构,可以保存到多个表,但对于对象世界是不可见的.如果你坚持下去,Base你会加载一个,Base但如果你坚持下去,DerivedA你将永远加载回来,DerivedA而不仅仅是Base因为它会破坏实体的原子性.

我没有尝试它,但我认为ESQL OFTYPE ONLY运算符也应该进行连接,以确保它真正加载基本实体的实际实例而不是损坏的派生实体实例.

Table-per-type产生慢查询..NET 4.5应该改进它,但我认为改进不会针对这些情况 - 我认为它们将OfType针对派生类型和预测.

如果您只想要来自Base表格的数据,那么您最好的选择是: