加入前包含不起作用实体框架6
Posted
技术标签:
【中文标题】加入前包含不起作用实体框架6【英文标题】:Include before join Doesn't work Entity Framework 6 【发布时间】:2014-01-10 10:49:49 【问题描述】:在 MVC4 项目中 我在 LINQ 查询中使用 include:
> var tests = from ct in context.CourseTest.Include("Test") join uc in
> context.UserCourse on ct.CourseID equals uc.CourseID select ct;
CourseTest 有一个测试对象
这在“使用上下文”中有效
但一旦返回控制器使用:
返回测试.ToList();
UserCourse.Test 正在处理中:
ObjectContext 实例已被释放,不能再使用 用于需要连接的操作。
这在旧版本中可以正常工作(不确定我是否使用连接进行了测试)。
我怎样才能让它粘住..?
【问题讨论】:
【参考方案1】:有时,include 子句会被忽略。我并没有想到所有情况,但加入、分组和投影实体会导致 EF 忽略包含。
在你的例子中,如果你这样做:
var Tests = from ct in context.CourseTest join uc in context.UserCourse on ct.CourseID equals uc.CourseID select ct;
return Tests.Include("Test").ToList();
这会起作用,因为包含不会被投影、分组或连接子句覆盖。
只是另一件事:
1/ 你的加入条款真的有用吗? (仅当您希望 muse 具有用户课程的课程测试时。)
2/ 对于您处置的上下文,这是因为您的 DbContext 使用延迟加载。您的 include 子句被忽略,但在延迟加载时,您的测试导航属性包含代理(即不为 null),而不是 null。因此,当您访问导航属性时,代理会看到未加载真实数据并执行查询以获取测试数据。您的上下文已处理,因此您有例外。
EF 生成查询,但仅在迭代结果时执行查询(在 foreach 循环中或使用 ToList()、ToArray()、ToDictionary()、...)因此,如果您是使用 using 子句的数据访问层对于您的上下文,请始终确保迭代您的结果以使 EF 执行查询(例如使用 ToList())。
【讨论】:
【参考方案2】:也许您可以使用上下文的单例实现。那么它不应该被释放(但有其他缺点,比如:只有一个上下文没有被释放)。
【讨论】:
单例上下文很危险!!它有并发问题。以上是关于加入前包含不起作用实体框架6的主要内容,如果未能解决你的问题,请参考以下文章