4

このコードが失敗する理由を理解するのに苦労しています

テスト方法があります

IUnitOfWork unitofwork = EFUnitOfWork.CreateInstance();
IRepository<InformationRequest> informationRequestRepository = unitofwork.CreateRepository<InformationRequest>();
IEnumerable<InformationRequest> requests = informationRequestRepository.ToList();
unitofwork.Dispose();

EFUnityOfWork.CreateInstance calls the EFUnitOfwork Constructor
public EFUnitOfWork()
  {

     _currentContext = new MyDataContext();
  }

CreateRepository のコードは次のとおりです。

public IRepository<T> CreateRepository<T>()
 {
     return new Repository<T>(_currentContext);
 }

上記のテストは、負荷テストでは機能しません。実行しようとすると、System.Data.EntityException: 基になるプロバイダーが Open で失敗しました。---> System.InvalidOperationException: 接続が閉じられませんでした。接続の現在の状態は接続中です。

コンテキストを破棄し、毎回新しいコンテキストを作成しています。どこが間違っているのかわかりません

4

1 に答える 1

2

コードEFUnitOfWork.CreateInstance()は静的メソッドです。

2つのスレッドが同時にこれを呼び出すと、同じコンテキストを取り戻すことができます。次に、表示されるエラーが発生する可能性があります。

一度に1つのスレッドによってのみ呼び出されるようにロックすることで修正できます。しかし、時間はパフォーマンスのボトルネックになります。

于 2011-07-19T10:14:27.650 に答える