2010-11-02 159 views
2

所以我已經得到這種感覺,我應該關閉延遲加載,原因有二:我應該關閉實體框架中的延遲加載嗎?

  1. 查詢成爲非原子,因此可能會導致併發性錯誤。
  2. 我或其他程序員可能最終導致巨大的性能障礙。

當然,只要我們小心,這兩個問題都可以避免,但在性能稍微重要的項目中似乎有點不必要的風險。

作爲一個附註,我發現奇怪的是,1- *關係屬性變成null,而不是在您通過延遲加載關閉時訪問它們時拋出異常。我想回去做所有事情,但是我擔心我可能會忽略一個錯誤,我將一個尚未加載的0- *關係解釋爲null

想法?

回答

6

如果您擔心表現,請關閉延遲加載,如果您不是,則不要。

就個人而言,我們關閉延遲加載,並明確允許通過接口的合同中包含的導航性能,爲我們的資料庫,如:

ICollection<Person> FindSingle(int personId, string[] includeAssociations); 

所以我們再渴望負荷導航性能只有在調用代碼明確要求的情況下。這就像是在對代碼說:「嘿,如果你想得到關於這個T的額外信息,那麼問ASK,否則你就不會這麼做!」。

至於1- *,當然屬性爲空。導航屬性通常在對象上實現爲ICollection<T>,因此如果沒有任何內容,則不會實例化集合。

可能通過在執行查詢時創建一個空集合而不是空集合來抵消這種影響。不過,我更喜歡將null集合添加到一個帶有0個項目的實例化集合中。

+0

這是一個很棒的想法,將包含作爲字符串[]傳入。關於空引用,我的意思是1-0關係,即對零或一個對象的引用。我認爲這些可能是模棱兩可的。謝謝! – 2010-11-02 12:18:42

+1

不用擔心。此外,通過使用includes,您可以通過傳遞一個「enum」數組而不是字符串,爲通常硬編碼的'.Include'代碼添加一些類型安全性。然後爲該枚舉創建一個擴展方法,該枚舉將枚舉轉換爲'.Include'字符串。這就是我們所做的。所以我們的代碼如下所示:'repository.FindSingle(1,PersonAssociations.Orders)'。只是一個獎金提示,免費:) – RPM1984 2010-11-02 20:35:15

+0

是的,我在想,但我發現自己懶惰,因爲如果你給它一個不正確的參數,EF會拋出一個異常。 – 2010-11-02 23:46:06

相關問題