最近在做項目用到了@鄒華棟老師的EF直接更新數據(不需查詢)的方法。 但是如果我們想修改的對象前面被查詢過了的話會出一個《ObjectStateManager 中已存在具有同一鍵的對象。ObjectStateManager 無法跟蹤具有相同鍵的多個對象》的錯誤。解決方法是查詢的時候加AsNoTracking無跟蹤查詢。但是我需要實體被EF context追蹤,所以加AsNoTracking是不行的。 然后花了三個多小時就改寫了方法,改方法可以修改查詢過的或是沒查詢過的對象但是需要主鍵名。不知道大神們有沒有更好的解決方法, 如果有的話歡迎留言交流。
1 /// <summary> 2 /// 修改 3 /// </summary> 4 /// <param name="model">要修改的實體對象</param> 5 /// <param name="primaryKey">主鍵名稱</param> 6 /// <param name="proNames">要修改的屬性名</param> 7 /// <returns></returns> 8 public int Update(T model, string primaryKey, params string[] proNames) 9 { 10 //對象添加到ef中 11 DbEntityEntry entry = db.Entry<T>(model); 12 //從緩存中查詢是否存在 13 var obj = db.Set<T>().Find(entry.Property(primaryKey).CurrentValue); 14 if (obj == null) 15 { 16 //對象狀態設置為Unchanged 17 entry.State = System.Data.EntityState.Unchanged; 18 //循環修改數組名狀態 19 foreach (string proName in proNames) 20 { 21 entry.Property(proName).IsModified = true; 22 } 23 } 24 else 25 { 26 //循環更改 27 foreach (string proName in proNames) 28 { 29 db.Entry(obj).Property(proName).CurrentValue = entry.Property(proName).CurrentValue; 30 } 31 32 } 33 34 //保存 35 return db.SaveChanges(); 36 }