2

私の WebAPI コントローラには次のものがあります。

   [HttpDelete]
    public HttpResponseMessage DeleteFolder(int id)
    {
        _service.DeleteFolder(id);
        return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
    }

_service は _db を使用した db アクセス サービスです。サービス クラスのコンストラクターで一度定義された、私のプロジェクトの DbContext のインスタンスです。

私のクライアントでは、for ループを使用して一連の非同期 AJAX 呼び出しを delete メソッドに送信し、複数のフォルダーを連続して削除しようとしました。それは次のようなものです:

基になるプロバイダーが Open で失敗しました。

この:

モデルの作成中はコンテキストを使用できません。

起こり始めました。競合状態が原因であると感じていますが、その場合の修正方法がわかりません。呼び出しごとに dbcontext の新しいインスタンスを作成する必要がありますか? もしそうなら、これはどこに作成されるべきですか?repository.cs の各メソッド内 (すべてのメソッドの使用に対して単一の dbContext が作成される場所)?

どんな助けでも大歓迎です。

4

1 に答える 1

0

はい、呼び出しごとに個別の DbContext が必要です。ドキュメントから;

この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。

できること (たとえば、トランザクションの使用方法に応じて) は、Unit of Workパターンを使用することです。これは、EF のケースが基本的DbContextにクラスでラップすることを意味する場合 (DbContext のような EF 固有のクラスを公開したくない場合)アプリケーション コード (または、階層化によってはビジネス コード) で次のようなものを記述できるようにします。

[HttpDelete]
public HttpResponseMessage DeleteFolder(int id)
{
    using(var uow = new UnitOfWork()) {  // Creates a new DbContext
        _service.DeleteFolder(uow, id);
        uow.Commit();          
        return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
    }                                    // Uncommitted UoW rolls back on Dispose
}                                        // ie on unhandled exceptions.

...または、すべてのサービス/リポジトリ メソッドで UoW を渡すのが煩わしいと思われる場合 (私はそう思います)、UnitOfWOrk コンストラクターにそれを「現在アクティブな作業単位」として保存させて、HttpContext.Current.Items任意のサービス/リポジトリがフェッチできるようにすることができます。必要に応じて現在の作業単位。

于 2013-07-07T05:37:09.700 に答える