【发布时间】:2011-04-09 22:18:12
【问题描述】:
我正在使用带有 MVC 的 Entity Framework 4,并且需要确保在控制器方法返回之前我想在视图中使用的任何引用实体都已加载,否则视图会吐出可怕的东西:
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。
如果您没有对上下文的引用,这些方法都不起作用。
【问题讨论】:
-
虽然这不能回答您的问题(因此我将其作为评论发布) - 它确实讨论了加载相关实体,因为它目前在 EF6 中工作。这也是谷歌搜索“实体框架加载相关实体”时出现的第一个 SOF 链接:msdn.microsoft.com/en-us/data/jj574232。所以我想我会分享...
标签: .net entity-framework entity-framework-4 eager-loading