2011-08-30 47 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中的值对象并保存它。现在,您拥有所有关系以及表单中的值。