今天編碼過程中遇到這個問題,用EF 更新數據庫,將組織好的數據傳遞到ef的上下文中,本以為附加上去更新,一切就ok了,不過事實證明沒這么順利
---------------------------------------------
ObjectStateManager 中已存在具有同一鍵的對象。ObjectStateManager 無法跟蹤具有相同鍵的多個對象
---------------------------------------------

看了很多博文,總結原因是當前上下文中已經包含了這一條記錄,而且是出於被跟蹤狀態,所以不能再附加具有相同鍵的對象
很多人都遇到了這個問題,各有各的解決辦法,在這個鏈接博文的啟發下,因為需求不同故做了一點小小修改;山人自有妙計
找到了一個相似的解決方案
記錄一下我自己的情況的解決方案:
//update public virtual bool Update(T entity) { //子類重寫 return true; }
將BaseDal 中實現 接口 Update 的方法變成虛方法,然后讓每一個子類去重寫這個方法(如下);
public override bool Update(LYMX lymx) { var entity = datamodelcontainer.Set<LYMX>().Find(lymx.ZSGBH); if (entity != null) { datamodelcontainer.Entry<LYMX>(entity).State = System.Data.EntityState.Detached; //這個是在同一個上下文能修改的關鍵 } // 組織需要的數據 entity.RCBABH = lymx.RCBABH; entity.ZSZT = lymx.ZSZT; entity.GXSJ = DateTime.Now; datamodelcontainer.Set<LYMX>().Attach(entity); datamodelcontainer.Entry(entity).State = EntityState.Modified; return true; //datamodelcontainer.SaveChanges() > 0; }
首先通過lymx 的逐漸,取得上下文中的這一條記錄,將狀態修改成“System.Data.EntityState.Detached” 而后組織數據,附加到上下文,進行更新.