我们错误地在每个存储库中定义了一个新的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;
}
}
现在项目构建正常,但我们仍然得到与本文开头所描述的相同的错误。我忘记了这一步吗?我真的找不到它为什么不起作用。