c# - 使用 IQueryable<> 时 DbContext 已被释放

标签 c# asp.net-mvc entity-framework

我在存储库中有一个简单的查询,如下所示:

   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 query ,直到它被实际调用才执行。但是我不明白为什么会抛出异常

"DbContext Has Been DIsposed"

当我将其更改为 IQueryable<> 时,我唯一的选择是在存储库中设置 DbContext 的私有(private)实例并保持打开状态吗?

最佳答案

在上面的代码示例中,您正在调用 ToList(),它会在 using block 结束之前从数据库中获取您的结果来处理您的上下文。这样应该可以正常工作。

如果您返回一个 IQueryable,那么在您调用 ToList()FirstOrDefault() 或其他任何内容并实际执行查询时(可能在您的代码中很久以后),using block 早已处理掉您的“MeetingContext”,因此您不能使用它。因此异常(exception)。

关于c# - 使用 IQueryable<> 时 DbContext 已被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24984801/

相关文章:

c# - C#中重载[]运算符并给出多个返回值

asp.net-mvc - Mvc 中的 QueryString 参数强类型操作链接

html - 像数组一样访问 Viewbag?

javascript - 在 JavaScript 函数中使用 C# for 循环中的迭代变量

.net - 获取实体导航属性的子集

entity-framework - Ninject WebAPI 操作无法完成,因为 DbContext 已被释放

c# - wpf 数据网格行中的小计单元格

c# - ASP.NET ListView 数据源是字符串[]

c# - 在 winform RichTextBox 中更改行间距

c# - Entity Framework 代码首先将 TPT 转换为 TPH