Если вы запрашиваете DbSet DbContext, запрос действителен до тех пор, пока не будет удален DbContext. Ниже приведет к исключению:Entity Framework присоединяет запрос к новому DbContext
IQueryable<Video> allVideos = null;
using (var context = new MyDbContext())
{
allVideos = context.Videos;
}
var firstVideo = allVideos.first();
Видимо используется DbSet хранится где-то в возвращенном объекте, который реализует IQueryable.
Однако MSDN советует (Link)
При работе с веб-приложениями, используйте экземпляр контекста для каждого запроса.
Конечно, я мог бы использовать 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 предложил просто выполнить запрос. Помните, что ваш запрос - это просто выражение, которое удерживается контекстом. Он либо выполняется, либо отбрасывается. Хотя можно сохранить выражения и выполнить их позже, в этом случае вам действительно не нужно. –