你的位置:首页 > ASP.net教程

[ASP.net教程]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        //对象状态设置为Unchanged17        entry.State = System.Data.EntityState.Unchanged;18        //循环修改数组名状态19        foreach (string proName in proNames)20         {21          entry.Property(proName).IsModified = true;22         }23       }24      else25       {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    }