解决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>();