EF+泛型修改方法(查詢修改和不查詢修改)


最近在做項目用到了@鄒華棟老師的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        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM