2011-08-30 49 views
1

我想知道如何加載多個級別的實體;更具體地說,如何加載單個實體的多個級別的後代。這是我創建的一個例子。假設在一個Web界面上,創建新產品後,我想顯示其類別類型。因此,我們有某一類的產品,而這一類有一個類別類型同一個名字:asp.net mvc 3 - 你如何加載實體的孩子和大孩子?

[HttpPost] 
public ActionResult DoSomething(Product product) 
{ 
    if (ModelState.IsValid) 
    { 
     productRepository.InsertOrUpdate(product); 
     productRepository.Save(); 
     ... 
     context.Entry(product).Reference(p => p.Category).Load(); 
     string someString1 = product.Category.SomeProperty; 
     ... 
     string someString2 = product.Category.CategoryType.Name; 
     ... 

有人向我展示瞭如何在另一個帖子節省對象加載後的孩子(見someString1在上面的例子中) ,但我無法弄清楚如何加載grand-children(someString2)。

examples on the net顯示如何加載實體和所有相關對象的集合,但省略顯示如何加載單個實體的所有後代。

我正在使用ASP.Net MVC 3與EF 4.1。而這一切對我來說都是新鮮事,所以請耐心等待。

回答

1

你可以得到它這樣

context.Entry(product).Reference(p => p.Category).Load(); 
string someString1 = product.Category.SomeProperty; 
... 

context.Entry(product.Category).Reference(c => c.CategoryType).Load(); 
string someString2 = product.Category.CategoryType.Name; 
+0

我相信我曾嘗試過,但發出第二個context.Entry時收到錯誤消息。有關product.Category的內容不在上下文中。我會再試一次併發布確切的錯誤消息。 –

+0

是的,這將有助於確定正確的解決方案。 – getmk

+0

我又試了一次,現在它正在工作。自那時起,我的代碼發生了很大變化,所以我不知道爲什麼它不能正常工作,現在是這樣。無論如何非常感謝! –

0

我正在從事EF4.1項目。我不需要指定任何東西 - 子對象會自動加載。我只需要在該對象上調用一個屬性。

例如爲:customerObj.Address.County

+0

你可以在這裏的問題是,如果它的MVC - 延遲加載可能發生在視圖處理和上下文處理時,它會嘗試加載子代並失敗 - 儘管它們只指定了上面的保存,所以只要啓用了lazyloading並且您可以運行。 clude()在查詢上。 –

+0

@CodeRush:正如此線程中提到的那樣,創建新對象時,輕鬆加載不起作用: http://stackoverflow.com/questions/7138904/asp-net-mvc-3-complex-objects-and-延遲加載 –

1

確保EagerLoading(未惰性加載)已啓用。

http://blogs.microsoft.co.il/blogs/gilf/archive/2010/06/22/eager-loading-with-repository-pattern-and-entity-framework.aspx

如果你是顯示這樣的數據,你需要確保這個加載您的ObjectContext內全部完成。如果只保存數據,只要您在同一ObjectContext中使用數據,就可以延遲加載。

編輯: 既然要加載所有您發送該模型中的相關實體,嘗試簡單地加載如上所述,然後調用TryUpdateModel(yourLoadedModel)你的實體與您加載的合併從ModelState中的值對象並保存它。現在,您擁有所有關係以及表單中的值。