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)
由于衍生类型的数量不断增加,也不适合我.
除了我提到的那些之外,有没有可能的解决方案?
您正在使用Table-per-type => EF必须生成这些连接,因为它不知道您的实体究竟是什么类型.如果您的记录来自表中Base的相关记录,那么IT不得为该记录创建实体实例- IT必须创建实例,并且需要进行连接才能获得这些知识.DerivedABaseDerivedA
长期讨论为什么不允许这样做,而只是实体来自对象世界 - 它是原子数据结构,可以保存到多个表,但对于对象世界是不可见的.如果你坚持下去,Base你会加载一个,Base但如果你坚持下去,DerivedA你将永远加载回来,DerivedA而不仅仅是Base因为它会破坏实体的原子性.
我没有尝试它,但我认为ESQL OFTYPE ONLY运算符也应该进行连接,以确保它真正加载基本实体的实际实例而不是损坏的派生实体实例.
Table-per-type产生慢查询..NET 4.5应该改进它,但我认为改进不会针对这些情况 - 我认为它们将OfType针对派生类型和预测.
如果您只想要来自Base表格的数据,那么您最好的选择是:
| 归档时间: |
|
| 查看次数: |
2956 次 |
| 最近记录: |