解決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