asp.net mvc 3 - 如何加载实体的子项和子项?

时间:2011-08-30 05:28:48

标签: entity-framework asp.net-mvc-3

我想知道如何加载多个级别的实体;更具体地说,如何加载单个实体的多个级别的后代。这是我创建的一个例子。假设在Web界面上,在创建新产品后,我想显示其类别类型。所以我们有一个特定类别的产品,这个类别有一个名称为

的类别类型
[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显示如何加载实体和所有相关对象的集合,但省略了如何加载单个实体的所有后代。

我在EF 4.1中使用ASP.Net MVC 3。这一切对我来说都是全新的,所以请耐心等待。

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

确保启用了EagerLoading(而不是LazyLoading)。

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中的值与加载的对象合并并保存。现在您拥有所有关系以及表单中的值。

答案 2 :(得分: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;

答案 3 :(得分:0)

我正在研究EF4.1项目。我不需要指定任何内容 - 子对象会自动加载。我只需要在该对象上调用一个属性。

例如:customerObj.Address.County