加入前包含不起作用实体框架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的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架核心中的 SelectMany + Select 之后“包含”不起作用

实体框架代码优先 - 初始代码迁移不起作用

具有接口的实体框架不起作用 - 处理相同的最佳方法是啥?

实体框架脚手架和迁移不起作用

C# - 实体框架代码优先,延迟加载不起作用

VS 2010 - 带有 MySql 存储过程的实体框架似乎不起作用