3

私は MVC アプリで Ninject を使用しており、EF4.1 Code First も使用しています。2 つの異なるブラウザー インスタンスからリクエストを送信できることをテストしようとすると、問題が発生します。

基本的に、両方のブラウザでほぼ同時にログインすると、「モデルの作成中はコンテキストを使用できません」というエラーが表示されます。

さて、私の最初の仮定は、競合するインスタンスがあり、したがってコンテキストのスコープを正しく設定していないということです。

必要なテーブルを含む基本クラスのコンテキストがあり、これから継承します。次に、注入されたファクトリがあり、リポジトリをリクエストしたときに実際にコンテキストを作成する責任があります。

public class ContextFactory
{
     TContext Create<TContext>( ) 
}

接続文字列は実行時に決定されるため、これを行う必要があるため、web.config に含まれる接続文字列をそのまま使用することはできません。

public class Repository : BaseRepository<MyObject>
{
   public Repository(IContextFactory factory) : base(factory) 
   {
   }
}

リポジトリが必要なときにリポジトリを注入すると、独自の注入があり、そのコンテキストが作成され、デフォルトの実装を提供できるという考えです。

私の次の懸念は、一部のインスタンスを正しく閉じたり破棄したりしていないことです。セッションスコープで特定のオブジェクトデータを設定するために他の誰かの例を使用しましたが、ほとんどの場合、OnRequestScope を使用しようとします。

4

1 に答える 1

4

バインドするContextFactory必要があるようInRequestScopeです:

Bind<IContextFactory>().To<ContextFactory>().InRequestScope();

受け取ったエラーは、両方のリクエスト(各ブラウザインスタンスからの1つ)がEFコンテキストのまったく同じインスタンスを使用しようとしていることを示しているようですが、これはもちろん機能しません。

于 2011-05-12T21:32:44.453 に答える