我在我的模型設計中有一個非常深的關係樹,也就是根實體包含一個包含更多其他實體集合的實體集合,這些集合包含更多的集合,並且在...上開發一個業務層,其他開發人員必須使用來執行操作,包括獲取/保存數據。你如何處理實體框架中的深層關係樹?
然後,我正在考慮應對這種情況的最佳策略是什麼。我不能在檢索實體時允許EF解析所有的依賴樹,因爲它會以很多無用的JOIN結束(無用,因爲我可能不需要下一級的數據)。
如果我禁用延遲加載和執行預先加載對於需要什麼,它工作正常,但如果其他開發人員調用
child.Parent.Id
而不是child.ParentId
嘗試做一些新的東西(如新的要求或功能在開始時不考慮),如果不包括該依賴關係,它將得到一個NullReferenceException
,這是不好的......但這將是一個「快速錯誤」,並且可以立即修復。如果我啓用延遲加載,訪問的
child.Parent.Id
代替child.ParentId
在一個獨立的查詢中的每個被訪問時將結束到數據庫。它不會失敗,但它更糟,因爲沒有錯誤,只有性能下降,並且應該檢查所有代碼。
我對這兩種解決方案都不滿意。
我不高興有實體包含null或空集合,但實際上,它不是真實的。
我不滿意讓EF在任何時候對數據庫執行任意查詢。我想盡可能在一次拍攝中獲得所有信息。
所以,我想出了涉及禁用延遲加載和執行預先加載幾種可能的解決方案,但不知道哪個好:
我能創造一個
EntityBase
類,它包含表中沒有集合的數據,所以它們不能被訪問。而包含關係的具體實現,問題是你沒有太大的靈活性,因爲C#不允許多重繼承。我可以創建接口來「掩蓋」隱藏在該方法調用時不可用的屬性的對象。例如,如果我擁有一個
User.Roles
屬性,爲了向所有用戶顯示一個網格,我不需要解析.Roles
屬性,因此我可以創建一個不包含此屬性的接口「IUserData」。
但我不,如果這些額外的工作是值得的,也許快NullReferenceException
表示「該屬性尚未加載」就足夠了。
如果該屬性是虛擬的並且它沒有被覆蓋/設置,是否可以拋出特定的異常類型?
你使用什麼方法?
謝謝。
從你使用它的例子看起來你主要走樹底,是嗎? –
不是,它只是一個例子。你爲什麼要問? – vtortola