我有一个数据层,使用实体框架5连接到Sql Server。我也有一个LINQ查询,获得一些数据。此查询在与Web API一起使用时失败。我得到ObjectDisposedException。下面是查询:
using (MyContext container = new myContext())
{
return container.Sales
.Include("Products")
.Where(s => s.Id == id)
.FirstOrDefault();
}
数据层是一个由业务层公开的dll,也是一个由web api控制器调用的dll。我曾假设JSON序列化器延迟加载包含,但我的修复都不起作用。什么好主意吗?如果信息缺失,我会根据需要更新问题。
下面是业务层对数据层的调用:
public Sale GetSale(int id)
{
SaleRepository s = new SaleRepository();
return s.GetSale(id);
}
最后是对业务层的web api调用:
public Sale GetSale(int id)
{
SaleManager s = new SaleManager();
return s.GetSale(id);
}
这里有一个例外:
ObjectContext实例已被处理,不能再用于需要连接的操作。
这是因为延迟加载是在您的DbContext
被处置之后执行的。
要解决这个问题,你可以这样做来禁用延迟加载:
container.Configuration.LazyLoadingEnabled = false;
一定有延迟加载的问题,并且包含不像预期的那样工作-尝试更改代码以选择实际对象和包含的实体。
using (MyContext container = new myContext())
{
var result = container
.Sales
.Include("Products")
.Where(s => s.Id == id)
.FirstOrDefault();
result.Products.ToList();
return result;
}
这是延迟加载的一个问题。更合适的方法是在完成对请求的处理之前不处置DbContext
。你可以用几种方法来做,
1)在控制器中处理。框架将控制器的生命周期与请求的生命周期绑定在一起。
public class MyController : ApiController
{
private SaleManager _saleManager = new SaleManager();
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
_saleManager.Dispose();
}
}
}
2)使用request . registerfordispose ()
显式地将资源与请求绑定,(在您不在控制器内部的情况下很有用)SaleManager saleManager = new SaleManager();
Request.RegisterForDispose(saleManager);