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