9

我有以下的客戶類:我可以通過委託給EF中的存儲過程來延遲加載導航屬性嗎?

public class Customer 
{ 
    public long Id { get; set; } 

    public virtual ICollection<Order> Orders { get; set; } 
} 

我的數據庫具有客戶和訂單表,但沒有外鍵關係。客戶的訂單是通過使用存儲過程獲取客戶ID並返回訂單行來獲取的。我無法修改數據庫。

我知道如何從實體框架中調用存儲過程,但是,是否可以使用流暢API配置DbContext,以便訪問客戶對象的Orders集合可以通過調用存儲過程來延遲加載實體程序?

我正在使用EF的最新版本。

+0

嗨,你解決了這個問題嗎? – SimonGates 2015-03-06 21:05:33

+0

如果可以,我會非常驚訝,我認爲唯一的選擇是Eager Loading或創建外鍵。 – Heberda 2015-04-27 13:08:01

+0

難道你不能創建一個相同的視圖嗎?你爲什麼要懶加載?爲什麼你需要存儲過程? – 2015-06-29 10:24:24

回答

1

不,你不能。延遲加載在EF創建的代理對象中編碼(如果可能的話),無法攔截/配置代理生成的方式。

甚至不可能將DbSet的默認讀取操作映射到存儲過程。這始終是一個查詢。只有create, update and delete can be mapped to stored procedures

原因(我認爲)存儲過程是不可組合的,所以如果在一個複雜的LINQ查詢中一個實體將被映射到一個存儲過程(用於讀取),則不可能將該查詢轉換爲一個SQL語句。

+0

根據上面的答案,延遲加載的唯一選擇是創建一個視圖。 – 2015-08-04 21:21:04