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 であり、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 インスタンスは破棄されており、接続を必要とする操作には使用できなくなりました。

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 に答える