如果您查詢DbContext的DbSet,則該查詢在DbContext處置之前有效。以下將導致一個例外:實體框架將查詢附加到新的DbContext
IQueryable<Video> allVideos = null;
using (var context = new MyDbContext())
{
allVideos = context.Videos;
}
var firstVideo = allVideos.first();
顯然,使用DbSet某處存儲在實現的IQueryable返回的對象。
然而,MSDN建議(Link)
當使用Web應用程序,使用每個請求的上下文實例。
當然,我可以使用ToList()並返回結果作爲對象列表,但這是相當不可取的,因爲我不知道查詢的原因。
例如:假設我的數據庫有一個收集國家,這些國家的城市有街道,有街道,有房屋,有家庭,有名字的人。
如果有人要求IQueryable,那可能是他想要搜索居住在英國倫敦唐寧街10號的最老人的姓名。
如果我用ToList()返回了序列,那麼所有的城市,街道,房屋,人等等都會被返回,如果他只需要這個人的名字就太浪費了。這是關於延遲執行Linq的好處。
所以我不能返回ToList(),我必須返回IQueryable。
所以我喜歡做的,是打開一個新的DbContext,並以某種方式告訴它應該使用新的DbContext查詢:
IQueryable<Video> allVideos = null;
using (var context = new MyDbContext())
{
allVideos = context.Videos;
}
// do something else
using (var context = new MyDbContext())
{
// here some code to attach the query to the new context
var firstVideo = allVideos.first();
}
如何做到這一點?
爲什麼要這麼做,只需在第一個上下文中調用ToList()來強制查詢執行 – 3dd
由於@ 3dd建議只執行查詢。請記住,你的查詢只是一個被上下文保留的表達式。它被執行或丟棄。儘管可以保存表達式並稍後執行,但在這種情況下實際上並不需要。 –