如何为使用存储库的所有实例使用一个数据库上下文?
我做了一些建筑MVC错误,因为我不知道
IEntityChangeTracker的多个实例不能引用实体对象。
错误。
我的设置如下:我有一个访问数据库的repository
,它创建了一个dbcontext
实例,我有控制器实例化他们需要的managers
, managers
都实例化他们自己的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
。