在實體框架中使用存儲過程,如何讓實體填充其導航屬性?

.net c# entity entity-framework

實體框架非常慢,所以我嘗試使用存儲過程,但我遇到了這個問題。

實體框架允許您定義生成實體的存儲過程。但是,我的實體具有“導航屬性”,使用此方法時未填充這些屬性。

有工作嗎?

一般承認的答案

存儲過程不可組合。因此,無法使用Include()或其他方法調用您的SPROC並讓EF自動在同一查詢中填充關係。

所以說你有產品和類別

你有一個sproc來獲得產品:

var products = context.GetProducts(someproductfilter);

生成的產品不會加載其類別。

但是,如果您有第二個存儲過程來獲取所述產品的類別:

var categories = context.GetCategoriesForProducts(someproductfilter);

EF中稱為關係修正的功能,在第二個實體進入上下文後鏈接相關實體,將確保在兩次調用完成後,產品中的每個產品都具有非空類別。

這並不理想,因為您正在執行多個查詢,但它會起作用。

另一種方法是使用EFExtensions 。寫這篇文章的人創造了編寫sprocs的能力,可以一次加載更多數據。

希望這可以幫助

乾杯亞歷克斯


熱門答案

在使用EF研究存儲過程(SP)時,我發現了這個問題。我也看到像@KristianNissen和@Todilo這樣的人問過EF6是否有更新。

答案是肯定的,EF 6改變了一些東西,但在使用SP時它沒有添加任何東西來幫助加載導航屬性。你也不能像在這個SO問題中那樣使用帶有SP的.Include()方法。

唯一的方法是編寫SP以專門加載導航屬性。但是現在有一些關於使用SP的好的Microsoft文檔 - 請參閱Query SPSP返回多個結果集

為了完整起見 ,EF版本6引入的更改是允許存儲過程(SP)處理插入,更新和刪除 - 請參閱Microsoft文章實體框架Tutotial



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因