最近在做项目用到了@邹华栋老师的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 }
时间: 2024-10-17 02:47:17