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        }

 

转载于:https://www.cnblogs.com/mauleta/p/4627357.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值