解决EF通过Attach跟踪实体,来实现更新和修改时,如果根据ID(主键)无法找到对应的实体,当执行SaveChanges时会报错(原创)


解决EF通过Attach跟踪实体,来实现更新和修改时,如果根据ID(主键)无法找到对应的实体,当执行SaveChanges时会报错:
存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项

解决:

增加一个方法:
private bool Exists(TEntity entity)
{
var entityKey = _ObjContext.CreateEntityKey(_ObjSet.EntitySet.Name, entity);

Object foundEntity;
var exists = _ObjContext.TryGetObjectByKey(entityKey, out foundEntity);
// TryGetObjectByKey attaches a found entity
// Detach it here to prevent side-effects
if (exists)
{
_ObjContext.Detach(foundEntity);
}

return (exists);
}

/// <summary>
/// modify entity
/// </summary>
/// <param name="entity">entity</param>
public void Update(TEntity entity)
{
if (Exists(entity))
{
_DbSet.Attach(entity);
_DbContext.Entry<TEntity>(entity).State = System.Data.EntityState.Modified;
}
}

/// <summary>
/// delete entity
/// </summary>
/// <param name="entity">entity</param>
public void Delete(TEntity entity)
{
if (Exists(entity))
{
_DbSet.Attach(entity);
_DbContext.Entry<TEntity>(entity).State = System.Data.EntityState.Deleted;
}
}

注:_ObjContext是ObjectContext对象,_ObjSet是ObjectSet对象
_ObjContext = ((IObjectContextAdapter)this._DbContext).ObjectContext;
_ObjSet = _ObjContext.CreateObjectSet<TEntity>();


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM