各リポジトリで新しい DbContext を定義するのは間違いでした。そのため、開発中に、次のような多くのエラーに遭遇しました。
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
したがって、最善の方法は、すべてのリポジトリが各リクエストで同じコンテキストを使用するようにすることです。最初は NinjectControllerFactory があり、そこにリポジトリ バインディングも配置しました。Ninject.Web.Commons nuget パッケージをインストールすると、App_Start に NinjectWebCommon.cs ファイルが作成されました。
バインディングをすべて NinjectWebCommon ファイルに移動し、NinjectControllerFactory が同じカーネルを使用するようにしました。DbContext クラスをバインディングとして追加し、InRequestScope メソッドを指定しました。
ninjectKernel.Bind<EfDbContext>().ToSelf().InRequestScope();
各リポジトリは、コンストラクターを介してコンテキストを参照するようになりました。
public class EfPageRepository : IPageRepository
{
EfDbContext context;
public EfPageRepository(EfDbContext dbContext)
{
this.context = dbContext;
}
}
これでプロジェクトは正常にビルドされますが、この投稿の冒頭で説明したのと同じエラーが引き続き発生します。ここでステップを忘れましたか?なぜ機能しないのか、本当にわかりません。