我想知道如何加载多个级别的实体;更具体地说,如何加载单个实体的多个级别的后代。这是我创建的一个例子。假设在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。这一切对我来说都是全新的,所以请耐心等待。
答案 0 :(得分:2)
参见热切加载多个实体级别和明确加载相关实体 http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx
答案 1 :(得分:1)
确保启用了EagerLoading(而不是LazyLoading)。
如果您正在显示这样的数据,则需要确保此加载全部在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