首页 新闻 会员 周边

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象

0
悬赏园豆:15 [已关闭问题] 关闭于 2016-10-26 12:40

我用同一个unitOfwork模式 对数据进行增删查改,可现在发现这样一个问题:

当我新增了一个数据,再次调用删除方法去删除刚刚新增的数据就报:“ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象”的错误。

代码如下:

  public class UnitOfWork : IUnitOfWork
    {
        private IDbContext _dbContext;

        public UnitOfWork(IDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        public void RegisterNew<TEntity>(TEntity entity)
            where TEntity : class
        {
            _dbContext.Set<TEntity>().Add(entity);
        }

        public void RegisterNew<TEntity>(List<TEntity> entity) where TEntity : class
        {
            _dbContext.Set<TEntity>().AddRange(entity);
        }

        public void RegisterDirty<TEntity>(TEntity entity)
            where TEntity : class
        {
            _dbContext.Entry<TEntity>(entity).State = EntityState.Modified;
        }

        public void RegisterClean<TEntity>(TEntity entity)
            where TEntity : class
        {
            _dbContext.Entry<TEntity>(entity).State = EntityState.Unchanged;
        }

        public void RegisterDeleted<TEntity>(TEntity entity)
            where TEntity : class
        {
        //    _dbContext.Set<TEntity>().Attach(entity);
            _dbContext.Set<TEntity>().Remove(entity);
        }

        public async Task<bool> CommitAsync()
        {
            return await _dbContext.SaveChangesAsync() > 0;
        }

        public void Rollback()
        {
            throw new NotImplementedException();
        }


        public bool Commit()
        {
            try
            {
                var result = _dbContext.SaveChanges() > 0;
                //   _dbContext.Dispose();
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


    }
View Code

 

ObjectStateManager 怎样才能清楚上下文的附加?

网上找了一下

我使用了:_dbContext.Entry(entity).State = EntityState.Detached;

这种方式加在RegisterNew 方法之后,报错。

虔城墨客的主页 虔城墨客 | 初学一级 | 园豆:185
提问于:2016-08-13 14:54
< >
分享
所有回答(1)
0

调用代码呢?

顾晓北 | 园豆:10844 (专家六级) | 2016-08-15 09:27

AJAX创建用户

UnitOfWork.RegisterNew(object);

UnitOfWork.commit();

AJAX删除用户

UnitOfWork.RegisterDeleted(Obj)

UnitOfWork.commit();

同一个页面进行操作

支持(0) 反对(0) 虔城墨客 | 园豆:185 (初学一级) | 2016-08-15 09:43

@虔城墨客: IDbContext怎么传的?

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2016-08-15 09:45

@顾晓北:

public class CollectorDbContext : DbContext, IDbContext
{
}

支持(0) 反对(0) 虔城墨客 | 园豆:185 (初学一级) | 2016-08-15 09:54

现在我改用ModelFirst 方式,也不行,对于刚刚attrch新增,然后提交的数据,ObjectStateManager  对这个实体一直处于attrch状态,现在我是通过: 

Add

commit

然后再修改状态:EntityState.Detached;

commit

再进行我后面想要对这个刚刚新增的数据进行删改操作:

delete

commit

才不报错

但这样太麻烦了,我不知道ef还有什么方式解决我这个问题,还是说这是我写的unitofwork 的问题

支持(0) 反对(0) 虔城墨客 | 园豆:185 (初学一级) | 2016-08-15 09:59

@虔城墨客: 然后这样new unitofwork(new CollectorDbContext()).RegisterNew(object);

类似这样子?

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2016-08-15 10:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册