如何为使用存储库的所有实例使用一个数据库上下文?

我做了一些建筑MVC错误,因为我不知道

IEntityChangeTracker的多个实例不能引用实体对象。

错误。

我的设置如下:我有一个访问数据库的repository ,它创建了一个dbcontext实例,我有控制器实例化他们需要的managersmanagers都实例化他们自己的repository 。 这是问题,当控制器使用多个manager收集数据然后尝试创建使用此数据的对象时,将对象添加到dbcontext时会出现上述错误。

我读到了关于UnitOfWork模式的内容,但重新构建我的代码似乎需要做很多工作。 是否有快速修复能够更新数据库并避免错误?

谢谢。

我认为快速修复问题的方法之一是添加dependency injection。 当然,理想情况下,世界存储库应该只有DbContext实例,并且不知道它是如何创建的。

您还没有提供任何代码示例,因此我将提供非常简单的示例。

在此示例中, Autofac用作IoC容器。 在Global.asax.Application_Start方法中编写此代码。

 var builder = new ContainerBuilder(); builder.RegisterType().As().InstancePerRequest(); 

然后在您的存储库中:

 public class Repository1 { public IYourDbContext DbContext { get; private set; } public Repository1() { // How it's probably have been before // DbContext = new YourDbContext(); // Getting DbContext from IoC container DbContext = (IYourDbContext) DependencyResolver.Current.GetService(typeof (IYourDbContext)); } } 

如果您不想添加额外的库,可以将DbContext实例保存在HttpContext.Current.Items