2012-09-07 43 views
3

我正在使用實體框架4.3與單位工作/存儲庫模式。在這種情況下,工作單元是一個請求。實體框架何時填充導航屬性?

工作單元也顯式設置延遲加載爲true。

但是,我對這種情況下什麼時候加載的東西有點困惑,並且有些建議值得讚賞。

var context = Local.Items.Uow.Context; // the context 

    var r = new ReadRepo<Deal>(context); // the repository 

    var deals = r.Find(); // IQueryable<Deal> 

    Rpt_BookmarkedDeals.DataSource = deals.ToList(); 
    Rpt_BookmarkedDeals.DataBind(); 

存儲庫交易,具有'存儲'的導航屬性。僅當中繼器是數據綁定時才知道加載Store的要求。我猜這是導航屬性加載的位置,但我不確定。

這是做這件事的最佳方式還是應該在我得到交易時明確地將Store作爲Include()添加?

回答

4

僅當中繼器是數據綁定時才需要加載Store。我猜這是導航屬性加載的位置,但我不確定。

是的,延遲加載的導航屬性在引用屬性時被加載,並且綁定到該屬性引用它。

這是做這件事的最好方法還是應該在我得到交易時明確添加Store作爲Include()?

沒有單一的最佳方式。

如果您的交易鏈接到10個不同的商店,然後延遲加載deal.Store將導致10個單獨的查詢發送到數據庫,除了一個查詢獲得交易。如果您使用deals.Include("Store"),則一個查詢將一次檢索交易和商店,但每個交易重複每個商店的數據。哪一個表現更好取決於。

如果您使用延遲加載,如果商店及其交易在加載交易後但在商店之前被刪除,則可能會出現不一致。這可以通過使用事務來避免,但在這種情況下,事務將不得不持續到商店被加載。

您需要權衡不同方法的優缺點,以確定哪種方法最適合您的情況。

+0

感謝您的建議。這10個問題是引發這個問題的擔心。在回答你的問題時,如果我正在爲一家商店收集交易,那麼所有交易都是相同的,但如果是這樣的話,那麼類別可能是10家不同的商店。 – dotnetnoob