gpt4 book ai didi

c# - 在 UnitOfWork 中存储对通用存储库的引用

转载 作者:行者123 更新时间:2023-11-30 12:14:08 26 4
gpt4 key购买 nike

我正在使用以下 UnitOfWork 类,以便通过使用泛型为我的实体获取存储库。

public class UnitOfWork : IUnitOfWork
{
private readonly EfDbContext _context;

public UnitOfWork()
{
_context = new EfDbContext();
}

public IRepository<T> RepositoryFor<T>() where T : Entity
{
return new Repository<T>(_context);
}

public void Save()
{
_context.SaveChanges();
}
}

但是,我遇到了一些问题,我有两个独立的类为单个实体独立实例化 UnitOfWork,这意味着为该实体创建了两个存储库。当我尝试保存实体时,这会导致 Entity Framework 出现问题,抛出“实体对象不能被 IEntityChangeTracker 的多个实例引用”错误。

我认为我需要更严格地遵循此 post by Tom Dykstra 中描述的 UOW 模式 在“创建工作类单元”部分下,其中存储库存储在私有(private)字段中,如果存在则重复使用,如果为空则创建。我遇到的问题是我希望我的 UOW 继续使用泛型 - Repository<T> - 并且不必为代码中的所有实体类型声明私有(private)存储库字段。

我如何能够存储给定类型的存储库已经实例化这一事实并重新使用它而不是创建它的新实例?

--- 编辑:这是修复---

使用 Ninject,我通过指定 InRequestScope 调整我的绑定(bind)以仅实例化存储库和 UOW 的单个实例

kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope();
//kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope(); // Removed based on comment below
kernel.Bind(typeof(EfDbContext)).ToSelf().InRequestScope();

最佳答案

问题不在多个存储库中,而是在多个 DbContext 实例中。 EF 告诉您不能同时将同一个实体实例添加到多个上下文中。所以共享存储库无济于事。此外,拥有多个 UoW 共享单例存储库是通往 hell 之路。处理并发(EF 不是线程安全的)、状态等将非常困难。

要解决此问题,您应该执行以下任一操作:

  1. 共享工作单元,以便您在整个单个业务操作中使用相同的 UoW 实例(和 DbContext)
  2. 在将它们添加到另一个 UoW 之前创建实体实例的副本。

选择取决于您的具体情况。

关于c# - 在 UnitOfWork 中存储对通用存储库的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10201254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com