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

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