首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF 6工作单元存储库:一个实体对象不能被多个IEntityChangeTracker实例引用

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

Stack Overflow用户
提问于 2020-08-13 01:14:09
回答 1查看 32关注 0票数 0

我正在使用工作单元存储库模式,使用Unity Dependacy Inhejection将DataContext注入Repo的

我不断得到一个entity对象不能被多个IEntityChangeTracker实例引用。当我使用其他存储库来查找对象中的外键时,

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

下面是我注册DI的过程

代码语言:javascript
复制
     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;
            }
        }

}

EN

回答 1

Stack Overflow用户

发布于 2020-10-19 03:11:07

为了确保您共享相同的db上下文实例(以避免此异常),请将您的db上下文也添加到容器中。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63381622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档