2013-12-21 37 views
4

在MVC4項目 我使用包括在LINQ查詢:包括前加入不行的實體框架6

> var tests = from ct in context.CourseTest.Include("Test") join uc in 
> context.UserCourse on ct.CourseID equals uc.CourseID select ct; 

CourseTest有一個測試對象

這工作的「使用上下文」內

但一旦返回到控制器使用:

return tests.ToList();

UserCourse.Test被佈置:

的ObjectContext的實例已被設置,並且不再能夠用於需要連接的操作中使用的 。

這用於在舊版本中正常工作(不知道我是否用連接測試過)。

我該如何讓它堅持..?

回答

3

有時,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 /你的加入條款真的有用嗎? (只有當你想要那個有着用戶過程的課程測試時)。

2 /對於你的配置環境,這是因爲你的DbContext使用延遲加載。您的include子句將被忽略,但延遲加載(而不是null)會導致您的測試導航屬性包含代理(即非空)。因此,當您訪問導航屬性時,代理會查看真實數據未加載並執行查詢以獲取測試數據。你的上下文被處置,所以你有你的例外。 (),ToArray(),ToDictionary(),...)所以如果你使用一個數據訪問層使用一個使用子句爲你的上下文,總是一定要迭代你的結果,以便使EF執行查詢(例如使用ToList())。

0

也許你可以使用Singleton實現上下文。那麼它不應該被處置(但是還有其他缺點,比如:只有一個沒有處理的上下文)。

+0

單身上下文是危險的!它有併發問題。 – sotn