2

Entity Framework を使用してデータベースに接続する際に問題が発生しています。データベースに接続しようとすると、ランダムに次のエラーが発生します...

EntityException: The underlying provider failed on Open.
The connection was not closed. The connection's current state is connecting.

私のセットアップの背景を説明するために、私は MVC 4 と Ninject を使用しています。また、この記事で説明されているリポジトリと作業単位のパターンも使用しています。MVC 4 でデフォルトの NinjectWebCommon ファイルを使用しています。私の RegisterServices メソッドは次のとおりです...

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IMyEntities>().To<MyEntities>();
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
    // UnitOfWork has a dependency on MyEntities

    kernel.Bind<IAccountManager>().To<AccountManager>(); 
    kernel.Bind<ITransactionManager>().To<TransactionManager>(); 
    // AccountManager and TransactionManager has a dependency on UnitOfWork
}

私のページは正常に読み込まれますが、ページに 2 つの ajax 呼び出しがあり、エラーが発生します。ajax 呼び出しが削除されると、エラーは発生しません。行われた ajax 呼び出しが 1 つしかない場合、エラーは発生しません。エラーが発生するのは、両方の呼び出しが同時に行われた場合のみです。

ここに2つの異なるWeb APIコントローラーがあります...

public class AccountController : ApiController
{
    private readonly IAccountManager _AccountManager;

    public AccountController(IAccountManager accountManager)
    {
        _AccountManager = accountManager;
    }

    public HttpResponseMessage Get()
    {
        IEnumerable<Account> accounts = _AccountManager.Get();
        return Request.CreateResponse(HttpStatusCode.OK, accounts);
    }
}

public class TransactionController : ApiController
{
    private readonly ITransactionManager _TransactionManager;

    public TransactionController(ITransactionManager transactionManager)
    {
        _TransactionManager = transactionManager;
    }

    public HttpResponseMessage Get()
    {
        IEnumerable<Transaction> transactions = _TransactionManager.Get();
        return Request.CreateResponse(HttpStatusCode.OK, transactions);
    }
}

ここで何をすべきか本当にわかりません。これに関連するすべての記事を StackOverflow と Google で読みましたが、答えが見つかりません。この問題の発生を防ぐために私に何ができるか知っている人はいますか?

4

1 に答える 1

0

私は同じ問題を抱えていました。最終的に、同じ UnitOfWork インスタンスが別のスレッドからアクセスされていることがわかりました。私は Ninject にあまり詳しくありませんが、Account と TransactionManager を調べて、それらが UnitOfWork の異なるインスタンスにアクセスしていることを確認することをお勧めします。

于 2012-11-30T09:55:52.193 に答える