[英]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.