我用同一个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; } } }
ObjectStateManager 怎样才能清楚上下文的附加?
网上找了一下
我使用了:_dbContext.Entry(entity).State = EntityState.Detached;
这种方式加在RegisterNew 方法之后,报错。
调用代码呢?
AJAX创建用户
UnitOfWork.RegisterNew(object);
UnitOfWork.commit();
AJAX删除用户
UnitOfWork.RegisterDeleted(Obj)
UnitOfWork.commit();
同一个页面进行操作
@虔城墨客: IDbContext怎么传的?
@顾晓北:
public class CollectorDbContext : DbContext, IDbContext
{
}
现在我改用ModelFirst 方式,也不行,对于刚刚attrch新增,然后提交的数据,ObjectStateManager 对这个实体一直处于attrch状态,现在我是通过:
Add
commit
然后再修改状态:EntityState.Detached;
commit
再进行我后面想要对这个刚刚新增的数据进行删改操作:
delete
commit
才不报错
但这样太麻烦了,我不知道ef还有什么方式解决我这个问题,还是说这是我写的unitofwork 的问题
@虔城墨客: 然后这样new unitofwork(new CollectorDbContext()).RegisterNew(object);
类似这样子?