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        }
时间: 2024-10-17 02:47:17

EF+泛型修改方法(查询修改和不查询修改)的相关文章

AIX下PVID详解及其修改方法

AIX 下 PVID 详解及其修改方法 1.PVID 是什么 PVID 全称 physical volume identifier,它非常重要,相当于软序列号,当把一个磁盘变成 PV 时, 就生成了 PVID , PVID 是由机器序列号 (uname -m的前 8位 ) 和它生成的时间组成,这种机制保证了 PVID 的唯一性.当系统启动时,磁盘配置程序会寻找磁 盘上的 PVID ,并把它跟 ODM 库中的 PVID 信息进行比 对,如果在 ODM 中找到匹配的条目,则把和这个 PVID 相对应

BluetoothChat用于蓝牙串口通信的修改方法

本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这里我使用的全部都是SPP-CA的默认模式.其中波特率是9600.读者若要修改其匹配密码,波特率等请使用串口调试工具对SPP-CA使用AT命令进行修改.详情参考其技术手册. 首先介绍Android端,官方的SDK中给了一个BluetoothChat的版本,这个版本稍加修改就可以进行串口通信.由于源代码

微信公众平台名字修改方法

很多朋友注册微信时没有注意名称的填写,导致事后对名字不满意.或者由于企业的发展需要对微信名进行修改.但是在微信后台是无法改名称的,今天小编就来教教大家怎样快速修改微信公众平台的名字. 修改微信名称所需资料: 1.准备好微信公众平台的原始ID.微信号.登陆邮箱等资料. 2.需要提供运营人员的手机号码.身份证.联系邮箱. 修改名字的流程: 1.修改名字无需重新注册微信,二维码.粉丝等均不影响. 2.必须具体合法资质,如个体户营业执照.企业.机关单位.学校等的有效证件. 3.想好要修改的名字,目前仅能

命令行修改文件文件夹访问权限 cacls, 修改hosts内容方法

背景 日常使用Windows的过程中,hosts(C:\Windows\System32\drivers\etc)文件可能被一些程序串改,因此在网上找到禁止/允许修改hosts文件的bat脚本,但是在使用过程中有遇到了新的麻烦,特记录下相关问题的解决方法. 禁止/允许修改hosts文件的bat脚本 Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动

StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改

前言 使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey", "*key*"),然后再使用相关的方法进行相关的批量操作,但是如果缓存数据量比较大,效率低下,那么可以使用Lua脚本进行模糊查询的批量操作:ScriptEvaluate(LuaScript.Prepare(...)). 通过keys进行模糊查询后的批量操作 批量删除 1 var

CCS4.2编译出错提示与修改方法

可能需要的其他步骤 有时在迁移过程中向导并不会冒险去改动一些具体的内容,这时可能就需要您多加留意并解决这类问题.在大多数情况下,需要执行的更改位于内部的源文件或链接器命令文件中:由于向导在迁移过程中采用了保守的做法,因此不会直接修改这些类型的文件. ? 1. 例如,将会显示如下的消息框,<migration.log> 文件位于项目目录下.强烈建议打开此日志文件检查是否存在任何问题. 图 6:迁移警告 ? 2. CCSv3.3 中有些项目拥有自动导入的隐式包含目录,会引发生成错误.如果遇到这种情

工作备忘:cacti&nagios登录密码修改方法

[[email protected]]# mysql -u root -p mysql> use cacti; mysql> select * from user_auth; mysql> update user_auth set password=md5("cactipasswd") where id='1'; 现在cacti登录的新密码就是cactipasswd [[email protected]]# /usr/bin/htpasswd /usr/local/n

[Apache]改变Apache端口等配置修改方法

 如何改变Apache端口:找到Apache安装目录下conf目录下的httpd.conf文件.打开它,找到"Listen",紧接着Listen的数字就是端口号,默认状态下为"Listen 80".在之前的PHP专题中提到过关于在安装配置Apache时会遇到端口与IIS HTTP端口冲突的问题,因为IIS HTTP端口默认也为80.那么我们就可以在这里改变Apache的端口,从而避免冲突,比如可以改成:Listen 8011.改好之后别忘重起Apache服务使得配置

WINDOWS SERVER 2008远程桌面端口修改方法

微软默认的服务器远程端口是3389,这是被很多黑客利用的端口,如何修改掉了,下面我们来说方法很多朋友在使用WINDOWS操作系统的时候,都喜欢修改远程连接的默认端口.但是很多朋友由于修改端口的方法错误,导致自己不能远程操作服务器,给自己带来了麻烦.在这里,我给大家简单谈谈正确修改远程端口的方法 在开始-----运行菜单里,输入regedit,进入注册表编辑,按先面的路径进入修改端口的地方 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Te