6

我在MVC項目中使用EF 4.1和代碼優先,以及AutoMapper來映射實體以查看模型。如何映射具有延遲加載屬性的實體(不會導致它們加載)?

在使用代碼優先之前,我能夠排除導航屬性,以防止加載任何尚未加載的內容。我在我的查詢中使用了.Include()來包含我需要的引用,以避免額外的數據庫往返。

但是,對於代碼優先,我的實體只公開實體屬性(或ICollection,如果有多個)。我怎麼知道它是否在沒有觸發負載的情況下被加載?

假設可以這樣做,是否有辦法將此設爲AutoMapper的默認行爲,以便我不必在每個實體上明確排除成員?

回答

10

您可以檢查是否entity的參考或集合導航屬性已被加載EF Code First只對標記爲虛擬的屬性進行延遲加載(可以替代這些屬性並將其置於DynamicProxy而不是它)。如果您不讓虛擬財產變爲虛擬,您將關閉該虛擬財產的延遲加載。

+1

謝謝,那正是我需要的。太糟糕了,我需要上下文,可能不得不在我的存儲庫中添加一些幫助程序。 – 2011-03-20 16:49:50

2

您應該能夠通過關閉延遲加載到explicitly load他們:

bool isLoaded1 = dbContext.Entry(entity).Reference(e => e.MyReferenceProperty) 
        .IsLoaded(); 
bool isLoaded2 = dbContext.Entry(entity).Collection(e => e.MyCollectionProperty) 
        .IsLoaded(); 
+1

我認爲EF4.1和Code-First他有POCO,因此'IsLoaded'和'Load'將不會在導航屬性中可用。 – Slauma 2011-03-20 16:49:53

+0

謝謝,禁用懶加載也可以是一個選項 - 將看到什麼效果最好。 – 2011-03-20 16:50:32

4

using(var context = new FooBarEntities()) 
{ 
    context.ContextOptions.LazyLoadingEnabled = false; 
    Foo foo = context.Foo.Where(x => x.Id == myId).Single(); 
    ... 
    if(!foo.Bars.IsLoaded) 
    { 
     foo.Bars.Load(); 
    } 
    //do something with foo.Bars here 
} 
相關問題