码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-07 18:30:03      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

最近在做项目用到了@邹华栋老师的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        }

 

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

标签:

原文地址:http://www.cnblogs.com/mauleta/p/4627357.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!