我正在使用Entity Framework 4和MVC,需要确保在控制器方法返回之前加载任何要在视图中使用的引用实体,否则视图会输出可怕的错误信息:
“ObjectContext实例已被处理并且不能再用于需要连接的操作。”
当直接从上下文中选择时,我可以使用
粗暴的方法是通过循环来遍历它们:
如果我有100个推荐,这将在幕后创建101个SQL查询。理想情况下,我希望有一种方法/方法,可以仅通过一次访问SQL来加载所有
给我看钱。
编辑 我并不是真的对讨论这是否是一个好或坏的架构感兴趣。为了问题的简化,我已经简化了我的场景。您能否使用EF API做我要求的事情?
编辑2 Ladislav's edit 提供了新方法的希望,但似乎我还没有到达目标。我可以通过以下方式实现我想要的:
“ObjectContext实例已被处理并且不能再用于需要连接的操作。”
当直接从上下文中选择时,我可以使用
Include(string)
方法来强制它们包含在生成的SQL查询中:var sellers = context.Sellers.Include("Recommendations.User").ToList();
然而,如果我有一个帮助方法,它接受一个实体并需要加载所有项,那么就没有可用的Include
方法。
void Test(Seller seller)
{
// ensure all recommendations and their users are loaded
}
粗暴的方法是通过循环来遍历它们:
foreach (var recommendation in seller.Recommendations)
recommendation.User.ToString(); // just force a load
如果我有100个推荐,这将在幕后创建101个SQL查询。理想情况下,我希望有一种方法/方法,可以仅通过一次访问SQL来加载所有
Recommendation
和User
对象。给我看钱。
编辑 我并不是真的对讨论这是否是一个好或坏的架构感兴趣。为了问题的简化,我已经简化了我的场景。您能否使用EF API做我要求的事情?
编辑2 Ladislav's edit 提供了新方法的希望,但似乎我还没有到达目标。我可以通过以下方式实现我想要的:
context.Sellers.Include("Recommendations.User").Single(s => s.Id == seller.Id);
使用LoadProperty
的方法并不起作用...
context.LoadProperty(seller, "Recommendations.User");
...由于出现了错误,无法继续运行...
无法找到指定的导航属性Recommendations.User。
如果没有对上下文的引用,则这些方法都无法正常工作。