C# 使用IQueryable时已释放DbContext<&燃气轮机;
我在存储库中有一个简单的查询,如下所示:C# 使用IQueryable时已释放DbContext<&燃气轮机;,c#,asp.net-mvc,entity-framework,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);
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;
}
}
public List GetMeetingsInRadius(十进制纬度、十进制经度、整数英里、整数周天数)
{
var point=DbGeography.FromText(string.Format(“点({0}{1})”,经度,纬度),4326);
使用(MeetingContext db=new MeetingContext())
{
var结果=(来自数据库会议中的a)
其中a.地理位置.距离(点)*0.000621371新会议VM
{
地址=x.地址,
CasoID=x.地址,
DayOfWeek=x.DayOfWeek,
距离=x.地理距离(点)*0.000621371,
纬度=x.纬度,
LocationName=x.LocationName,
经度=x.经度,
MeetingName=x.MeetingName,
MeetingType=x.MeetingType,
选项=x。选项,
时间=x.时间
}).OrderBy(x=>x.Time).ToList();
返回结果;
}
}
我尝试将其更改为返回IQueryable
,而不是List
,我知道这会变成一个惰性查询,在实际调用它之前不会执行。但我不明白为什么它会抛出异常
“DbContext已被释放”
当我将其更改为
IQueryable
时,我唯一的选择是在存储库中设置DbContext的私有实例并保持其打开状态吗?在上面的代码示例中,您正在调用ToList()
,它在使用块处置上下文之前从数据库获取结果。所以这应该很好
如果您返回一个IQueryable
,那么当您调用ToList()
或FirstOrDefault()
或其他调用并实际执行查询时(可能在代码中要晚得多),using
块早已处理掉了您的“MeetingContext”,因此您无法使用它。因此出现了例外情况。在上面的代码示例中,您调用的是ToList()
,它在使用块处理上下文之前从数据库中获取结果。所以这应该很好
如果您返回一个IQueryable
,那么当您调用ToList()
或FirstOrDefault()
或其他调用并实际执行查询时(可能在代码中要晚得多),using
块早已处理掉了您的“MeetingContext”,因此您无法使用它。因此出现了例外。我就是这么想的。。。然后我必须看一下始终保持DbContext打开的利与弊??我只是认为框架将保持使用块打开,直到查询完成。这就是我所想的。。。然后,我必须看一下始终保持DbContext打开的利弊??我只是认为框架将保持使用块打开,直到查询完成