实体框架和Web API ObjectDisposedException



我有一个数据层,使用实体框架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);

相关内容

  • 没有找到相关文章

最新更新