注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

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

2017-12-05 14:29:29|  分类: EF |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近在做项目用到了@邹华栋老师的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        }
复制代码
  评论这张
 
阅读(54)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018