如何为使用存储库的所有实例使用一个数据库上下文?
How to use one database context for all instances that make use of a repository?
我犯了一些架构 MVC 错误,因为我不知道
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
错误。
我的设置如下:我有一个 repository
用于访问创建 dbcontext
实例的数据库,我有实例化他们需要的 managers
的控制器, managers
全部实例化自己的repository
。问题来了,当控制器使用多个 manager
来收集数据,然后尝试创建一个使用这些数据的对象时,将对象添加到 dbcontext
.
我阅读了有关 UnitOfWork 模式的信息,但围绕它重构我的代码似乎需要做很多工作。是否有快速修复能够更新数据库并避免错误?
谢谢。
我认为快速解决问题的方法之一是添加依赖注入。当然,在理想世界中,存储库应该只有 DbContext
个实例,并且不知道它是如何创建的。
您没有提供任何代码示例,因此我将提供非常简单的示例。
在此示例中,Autofac 用作 IoC 容器。在 Global.asax.Application_Start
方法中编写此代码。
var builder = new ContainerBuilder();
builder.RegisterType<YourDbContext>().As<IYourDbContext>().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
。
我犯了一些架构 MVC 错误,因为我不知道
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
错误。
我的设置如下:我有一个 repository
用于访问创建 dbcontext
实例的数据库,我有实例化他们需要的 managers
的控制器, managers
全部实例化自己的repository
。问题来了,当控制器使用多个 manager
来收集数据,然后尝试创建一个使用这些数据的对象时,将对象添加到 dbcontext
.
我阅读了有关 UnitOfWork 模式的信息,但围绕它重构我的代码似乎需要做很多工作。是否有快速修复能够更新数据库并避免错误?
谢谢。
我认为快速解决问题的方法之一是添加依赖注入。当然,在理想世界中,存储库应该只有 DbContext
个实例,并且不知道它是如何创建的。
您没有提供任何代码示例,因此我将提供非常简单的示例。
在此示例中,Autofac 用作 IoC 容器。在 Global.asax.Application_Start
方法中编写此代码。
var builder = new ContainerBuilder();
builder.RegisterType<YourDbContext>().As<IYourDbContext>().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
。