DbContext был удален при использовании IQueryable <>

1

У меня есть простой запрос в репозитории:

   public List<MeetingVM> GetMeetingsInRadius(decimal latitude, decimal longitude, int miles, int dayOfWeek)
   {
       var point = DbGeography.FromText(string.Format("POINT ({0} {1})", longitude, latitude), 4326);
       using (MeetingContext db = new MeetingContext())
       {
           var results = (from a in db.Meetings
                          where a.Geography.Distance(point) * 0.000621371 <= miles
                          && a.DayOfWeek == (Meetings.Models.Enums.DayOfWeek)dayOfWeek
                          select a).Select(x => new MeetingVM
                          {
                              Address = x.Address,
                              CasoID = x.Address,
                              DayOfWeek = x.DayOfWeek,
                              distance = x.Geography.Distance(point) * 0.000621371,
                              Latitude = x.Latitude,
                              LocationName = x.LocationName,
                              Longitude = x.Longitude,
                              MeetingName = x.MeetingName,
                              MeetingType = x.MeetingType,
                              Options = x.Options,
                              Time = x.Time
                          }).OrderBy(x => x.Time).ToList();               
           return results;
       }           
   }

Я попытался изменить его, чтобы вернуть IQueryable<> вместо List<>, и я понимаю, что это делает, чтобы стать Lazy-запросом и не выполняться до тех пор, пока он не будет вызван. Но я не понимаю, почему это исключает исключение

"DbContext был разложен"

когда я меняю его на IQueryable<>, я единственный вариант, чтобы сделать эту работу для установки частного экземпляра DbContext в репозитории и сохранить его открытым?

Теги:
entity-framework
asp.net-mvc

1 ответ

4
Лучший ответ

В приведенном выше примере кода вы вызываете ToList(), который получает ваши результаты из базы данных до того, как конец блока using ваш контекст. Так что это должно работать нормально.

Если вы IQueryable, то к тому времени, когда вы ToList() или FirstOrDefault() или что-то еще и действительно выполните запрос (возможно, намного позже в вашем коде), using блок уже давно избавлен от вашего "MeetingContext", поэтому вы не может его использовать. Отсюда исключение.

  • 0
    Это то, что я подумал ... Мне нужно посмотреть на плюсы и минусы, чтобы всегда держать DbContext открытым ??
  • 0
    У меня нет списка плюсов и минусов, но в целом вы должны попытаться создать экземпляр объекта как можно ближе к тому месту, где вам нужно его использовать, а затем утилизировать его, как только вы закончите его использовать. Вы должны быть осторожны с подключениями к базе данных. Вы можете в конечном итоге «удерживать» соединение с базой данных гораздо дольше, чем вам нужно, что означает меньшее количество соединений для других (поскольку большинство баз данных имеют ограничения на количество открытых соединений).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню