我将 Entity Framework 4 与 MVC 一起使用,并且需要确保在控制器方法返回之前我想在视图中使用的任何引用实体都已加载,否则视图会吐出可怕的内容:
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
AND对象。User
把钱拿出来。
编辑我对讨论这是一个好还是坏的架构并不是很感兴趣。为了这个问题,我已经简化了我的场景。你能用 EF API 做我要求的事情吗?
编辑 2
拉迪斯拉夫的编辑提供了一种新方法的希望,但似乎我并不完全在那里。
我可以通过这个实现我想要的:
context.Sellers.Include("Recommendations.User").Single(s => s.Id == seller.Id);
这种方法不适用于LoadProperty
...
context.LoadProperty(seller, "Recommendations.User");
...因为它因错误而失败...
找不到指定的导航属性 Recommendations.User。
如果您没有对上下文的引用,这些方法都不起作用。