簡體   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