EF6学习笔记十二:Update操作、批量数据操作

要专业系统地学习EF前往《你必须掌握的Entity Framework 6.x与Core 2.0》这本书的作者(汪鹏,Jeffcky)的博客:https://www.cnblogs.com/CreateMyself/ 数据操作CRUD,我们只说Update,因为在EF中Update有点复杂 后面我们说批量数据更新 Update操作 上下文没有提供Update方法,所以我们要更新操作一般都是讲数据查询出来,修改实体属性的值,然后SaveChanges()就OK了 眼熟一下平时的Update View Code 查询出来没做修改的实体,状态为Unchange,修改了属性值,状态变为Modified 现在要是我凭空new一个Product对象,id设置为数据库中某一个产品的Id,然后让上下文对这个新对象追踪,最后再修改实体状态为Modified,看看能不能修改 View Code 失败,在我对它进行追踪时就报错了。因为不能跟踪多个相同键的实体,就和数据库中主键重复冲突一样 System.InvalidOperationException: Attaching an entity of type '_2019011402.Entity.Product' failed because another entity of the same type already has the same primary key value. This can happen when using the 'Attach' method or setting the state of an entity to 'Unchanged' or 'Modified' if any entities in the graph have conflicting key values. This may be because some entities are new and have not yet received database-generated key values. In this case use the 'Add' method or the 'Added' entity state to track the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as appropriate. 解决办法就是,去掉一个追踪,那么我们把该条数据查询出来,对它取消追踪,这个再跟踪这个新对象就可以了 View Code 然后我贴一段代码,和主题没什么关系 View Code 接着看Update操作,如果我们只更新一个实体的部分属性呢? View Code 看看数据库中的情况 上面的情况说明Modified是全部更新,不能部分更新 部分更新 那么怎么部分更新?书中给了两种办法 1.手动指定更新属性 View Code 2.用Entry().CurrentValues.SetValues() 方法 View Code 但是我使用了之后,觉得不太好,也不知道是不是用错了,我遇到的问题是这样的,无法部分更新 比如数据库中存在这么一条数据{"name":"张三","age":25,"FK_AddressId":"234"},那么我现在只想更新Name,我就传递这个对象{"name":"赵四"},但是它还是全部更新 比如我没有指定age属性,那么修改为默认值“0”,外键在数据库中不能为空,报错 各位可以去弄一下 批量更新操作 平时做批量更新,那就是遍历修改呗 View Code 看看EF生成并执行的SQL语句 他会先把要更新的数据查询出来,然后逐条更新,如果你创建了存储过程,那么他会自动调用存储过程进行更新,这个性能会好一点 我这里有一个存储过程 然后真正的SQL执行是这样的 他首先会将要更新的数据查询出来,然后调用多次存储过程 还是觉得不太理想?那么作者告诉了我们一个更好的方案,使用第三方库:EntityFrameWork.Extended 引入命名空间:using EntityFramework.Extensions; 然后调用该Update方法 View Code 捕获到SQL语句是这样的,很奇怪用ctx.Database.Log = Console.WriteLine;捕获不到,我用的SQL Profiler,这应该是这个Extended库是第三方的原因,不是EF团队弄的 View Code 看看数据库里面 唉,也难怪别人都说EF性能不好,还有很多东西要学啊。https://www.cnblogs.com/jinshan-go/p/10280066.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信