我正在使用实体框架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
和User
对象。
让我看看钱。
编辑我并不是真的有兴趣讨论这是一个好还是坏的架构。为了这个问题,我简化了我的场景。你可以用EF API来做什么吗?
EDIT 2
Ladislav's edit的新方法带来了希望,但似乎我不太有。
我可以实现我通过该想什么:
context.Sellers.Include("Recommendations.User").Single(s => s.Id == seller.Id);
这种方法不使用LoadProperty
工作...
context.LoadProperty(seller, "Recommendations.User");
...因为它失败,出现错误...
无法找到指定的导航属性Recommendations.User。
如果您没有对上下文的引用,则这两种方法都不起作用。
虽然这不能回答你的问题(因此我把它作为评论发布) - 它确实讨论了加载相关实体,因为它目前在EF6中工作。这也是搜索“实体框架负载相关实体”时在Google中出现的第一个SOF链接:http://msdn.microsoft.com/en-us/data/jj574232。所以我想我会分享.. – 2014-05-30 14:12:38