EF 6工作单元存储库:IEntityChangeTracker的多个实例不能引用一个实体对象

问题描述

我使用的是工作单位存储库模式,使用Unity依赖注入将DataContext注入存储库中

我不断 IEntityChangeTracker的多个实例不能引用一个实体对象。 当我使用其他存储库查找对象以获取外键时,

例如,我的风险对象具有RiskType, 如果我将RiskTypeId设置为1,则对象将保存 如果我设置 RiskTypeId = 1; RiskType = RiskTypeRepo.GetById(1); 然后我得到 一个IEntityChangeTracker的多个实例不能引用一个实体对象

我在这里注册DI

     public static void RegisterComponents()
        {
          UnityContainer container = new Unity.UnityContainer();
          container.EnableDiagnostic();
    
          var context = new EveModel();
    container.RegisterType<IRiskRepository,RiskRepo>(new InjectionConstructor(context));
          container.RegisterType<IRiskService,RiskService>();
        
          //GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver( container);
          GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
        }





//here is the repo constructor and Save method



    public abstract class Repository<TEntity> : IRepositoryBase<TEntity> where TEntity : AbstractBase,new()
        public Repository(EveModel injectedContext)
                {
                    _context = injectedContext;
                    this.currentTime = DateTime.Now;
                        System.Data.Entity.SqlServer.SqlProviderServices.UseScopeIdentity = false;
                }

public async Task<TEntity> SaveAsync(TEntity obj)
        {
 
            try
            {
                //_context.Configuration.AutoDetectChangesEnabled = false;
                TEntity exist = await _context.Set<TEntity>().FindAsync(obj.Id);
                if (exist != null)
                {
                    _context.Entry(exist).CurrentValues.SetValues(obj);
                    await _context.SaveChangesAsync();
                }
                else
                {
                    ///_context.Entry(obj).State = EntityState.Added;
                    _context.Set<TEntity>().Attach(obj);
             


                    await _context.SaveChangesAsync();
                    _context.Entry(obj).Reload();
                    exist = await _context.Set<TEntity>().FindAsync(obj.Id);

                }

                return exist;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

}

解决方法

要确保共享数据库上下文的同一实例(以避免发生此异常),请将数据库上下文也添加到容器中。

UnityContainer container = new UnityContainer();
container.EnableDiagnostic();

container.RegisterType<EveModel>();
container.RegisterType<IRiskRepository,RiskRepo>(); // no need in InjectionConstructor parameter as Unity will resolve eveModel instance automatically

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...