Asp.net mvc 4 加入前包含不';t工作实体框架6

Asp.net mvc 4 加入前包含不';t工作实体框架6,asp.net-mvc-4,lazy-loading,entity-framework-6,Asp.net Mvc 4,Lazy Loading,Entity Framework 6,在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() 正在处理UserCours

在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实例已被释放,无法再使用 用于需要连接的操作

在较旧的版本中,这种方法可以很好地工作(不确定我是否用join测试过它)


我怎样才能让它粘住

也许您可以使用上下文的单例实现。那么就不应该处理它(但它还有其他缺点,比如:只有一个上下文没有处理)。

有时候,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();
这将起作用,因为include不会被投影、分组或连接子句覆盖

还有一件事:

1/你的加入条款真的有用吗?(仅当您希望muse拥有用户课程的课程测试时。)

2/对于已处理的上下文,这是因为DbContext使用延迟加载。您的include子句将被忽略,但在延迟加载的情况下,您的测试导航属性将包含一个代理(即不为null),而不是null。因此,当您访问导航属性时,代理会看到实际数据未加载,并执行查询以获取测试数据。您的上下文被释放,因此您有您的异常


EF生成查询,但仅在迭代结果时执行查询(在foreach循环中或使用ToList()、ToArray()、ToDictionary(),…),因此,如果您的数据访问层使用use子句作为上下文,请始终确保迭代您的结果,以使EF执行查询(例如使用ToList()).

单例环境是危险的!!它有并发问题。