2013-01-13 41 views
0

請考慮以下Order對象作爲實體框架實體。是否將Entity Framework對象中的虛擬IList枚舉爲IEnumerable枚舉?

如果我是投的Order實例下來IOrder,然後訪問IOrderLines財產,是否會導致虛擬OrderLines財產一一列舉,並從數據庫中加載所有OrderLine實體,返回的填充集合內存中的OrderLine實體?

或者,客戶端代碼是否會獲得對OrderLines集合的引用,一旦它實際枚舉(例如在foreach中),它將從數據庫加載實體?

public interface IOrder 
    { 
     IEnumerable<OrderLine> Lines { get; } 
    } 

    public class Order : IOrder 
    { 
     public int OrderId { get; set; } 



     public IEnumerable<OrderLine> Lines 
     { 
      get 
      { 
       return OrderLines; 
      } 
     } 

     public virtual ICollection<OrderLine> OrderLines { get; set; } 

     public Order() 
     { 
      OrderLines = new List<OrderLine>(); 
     } 
    } 
+0

我不明白你的問題。它看起來像兩個要求同樣的事情,但與「或」連接。 –

+0

對不起拉迪斯拉夫,我重新閱讀時看到了含糊不清的地方。我已經改變了這個問題,所以希望現在對你更有意義。 – Chris

回答

0

它將返回到OrderLines對象的引用,但暴露爲IEnumerable。這意味着只有客戶端代碼中的枚舉實際上會枚舉集合。這是整個集合:linq過濾器(Where)和預測(Select)不會被轉換爲SQL。

請注意,這些都不是所希望的。首先,上下文必須處於活動狀態,以允許延遲加載,其次,集合可能「很大」(儘管命令行可能不是重點)。根據應用程序的類型,將預先填充的OrderDto對象傳輸到客戶端可能會更好。

+0

「這意味着只有客戶端代碼中的枚舉實際上會枚舉集合。」 - 這是你說每個枚舉都會從數據庫中延遲加載相應的實體嗎? – Chris

+0

是的,如果上下文仍然存在,並且啓用了延遲加載,那麼會發生什麼情況。 –