繁体   English   中英

代码优先EF 6每个层次表SQL查询生成问题

[英]Code First EF 6 Table Per Hierarchy SQL query generation issue

我有一个带有多个继承类的模型。 我有一个4级层次结构:

--First level abstrac class A
  --Second level abstrac class AA
    --Third level:
     *abstract class AAA
     *abstract class AAB
     *abstract class AAC
     *class AAD
     *class AAE
     *abstract class AAF
     *class AAG
     *class AAH
     *abstract class AAI
       --Fourth level:
        *class AAA1
        *class AAA2
        *class AAA3
        *class AAB1
        *class AAB2
        *class AAB3
        *class AAC1
        *class AAC2
          ...
        *class AAF1
        *class AAF2
        *class AAF3
        *class AAF4
        *class AAF5

这只是层次结构之一。 至少还有3个,它们不太复杂。 它们之间有几种关系,几乎所有类都具有7个以上的属性。

现在,我使用每个类型的表,但是当我执行一个简单的LINQ查询时,例如:

        using (Logic.Context dc = new Logic.Context())
        {
            var prod = dc.AA.FirstOrDefault();
        }

AA包含所有子类。 当数据库为空时,大约需要25秒才能完成此简单测试。 用第四级类进行相同的LINQ查询只需要2秒。

我试图迁移到每个层次结构的表,默认情况下,使用列Discriminator生成的数据库很好,但是相同的测试却要花很长时间……LINQ查询从不执行,甚至没有完成。 所有表都将发生这种情况。

有什么建议吗?

我的理论是,仅仅做FirstOrDefault会花很多时间,因为上下文不知道哪个实体是“ First”

基本上是在问自己:首先是机管局吗? 获取实体1-这是...(经过25秒)哦,它是AAH! 干得好!

尝试将查询投影到可以仅从AA获得所有属性的对象上

例如,如果AA是

class AA 
{
   public Int32 Id {get;set;}
   public String Name {get;set;}
   public DateTime Created {get;set;}
}

那么您的查询可能会运行得更快

var prod = dc.AA.Select( a => new 
{ 
    Id = a.Id, 
    Name = a.Name, 
    Created = a.Created 
}).FirstOrDefault();

那么从理论上讲,也许EF不会关心第一个实体实际上是什么。

但..

当我在这里时-由于EF的CASE / JOIN地狱,我刚刚将所有TPT重构为我的项目。
我知道像这样使用SQL继承感觉很不错,但是当您不得不查看一个AA实例并弄清它的真正含义时,它会并且会烫伤您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM