3

我有一个使用 Entity Framework 5 连接到 Sql Server 的数据层。我还有一个获取一些数据的 LINQ 查询。此查询在与 Web API 一起使用时失败。我得到了 ObjectDisposedException。这是查询:

using (MyContext container = new myContext())
{
    return container.Sales
                    .Include("Products")
                    .Where(s => s.Id == id)
                    .FirstOrDefault();
}

数据层是一个dll,由业务层暴露,也是一个dll,由web api控制器调用。我曾假设 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 实例已被释放,不能再用于需要连接的操作。

4

3 回答 3

2

DbContext发生这种情况是因为在您的处置后正在执行延迟加载。

要解决此问题,您可以通过执行以下操作禁用延迟加载:

container.Configuration.LazyLoadingEnabled = false;
于 2013-03-22T18:29:20.030 回答
1

延迟加载肯定存在问题,并且包含无法按预期工作 - 尝试更改代码以选择实际对象和包含的实体。

using (MyContext container = new myContext())
{
    var result = container
        .Sales
        .Include("Products")
        .Where(s => s.Id == id)
        .FirstOrDefault();
    result.Products.ToList();
    return result;
}
于 2013-03-22T15:25:56.757 回答
1

这是延迟加载的问题。更合适的方法是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);
于 2013-03-22T16:47:29.707 回答