tnblog
首页
视频
资源
登录

EF多种更新方法。EF修改,Entity Framework修改。abp vnext ef 更新封装

7005人阅读 2020/5/16 12:54 总访问:823924 评论:3 收藏:1 手机
分类: ORM


方法1:直接执行更新的sql语句

过于简单不说了

方法2:先查询在更新

  1. Users result = oapEntities.Users.Where(a => a.Id == users.Id).FirstOrDefault();
  2. result.UserName = users.UserName;
  3. result.Number = users.Number;
  4. result.UClass = users.UClass;
  5. result.CheckType = users.CheckType;

需要查询一次效率不是太友好

方法3:不用查询直接更新

  1. //标识整个对象的状态为修改(他会把里边所有的字段都标识为修改,这个适合修改一个表的所有字段)
  2. oapEntities.Entry(users).State = System.Data.Entity.EntityState.Modified;

方法4:不用查询(不用查询一次效率会提高一些),而且也可以指明需要修改的字段

  1. //先要把实体添加到上下文当中(实体需要在上下文中才能做操作,否则会报错:实体不在上下文中)
  2. oapEntities.Users.Attach(users);
  3. var entry = oapEntities.Entry(users);
  4. entry.Property("UserName").IsModified = true;//指明用户名这个字段是因为被修改的
  5. entry.Property("Number").IsModified = true;
  6. entry.Property("UClass").IsModified = true;
  7. entry.Property("CheckType").IsModified = true;

方法5:封装通用的不查询更新需要字段的方法

  1. public int Update(T t, string keyName)
  2. {
  3. var entry = context.Entry<T>(t);
  4. //把user对象加入上下文,并且是没有改变的状态
  5. entry.State = Microsoft.EntityFrameworkCore.EntityState.Unchanged;
  6. //使用反射找到不为空的字段
  7. foreach (var item in t.GetType().GetProperties())
  8. {
  9. //虚拟属性是导航属性
  10. if (item.GetMethod.IsVirtual)
  11. {
  12. continue;
  13. }
  14. //拿到属性值
  15. object obj = item.GetValue(t);
  16. if (obj != null)
  17. {
  18. //不是主键才去修改,如果是主键就不需要修改了
  19. if (item.Name != keyName)
  20. {
  21. //表示该字段需要更新
  22. entry.Property(item.Name).IsModified = true;
  23. }
  24. }
  25. }
  26. return context.SaveChanges();
  27. }

ef core检查某个字段是否是主键:
https://www.tnblog.net/aojiancc2/article/details/3278

abp vnext ef 更新封装

更新指定的字段:

  1. /// <summary>
  2. /// 更新指定的字段
  3. /// </summary>
  4. /// <param name="entity"></param>
  5. /// <param name="fields"></param>
  6. /// <returns></returns>
  7. public async Task<int> UpdateAsync(TEntity entity, List<string> fields)
  8. {
  9. if (entity == null || fields == null || fields.Count == 0)
  10. return 0;
  11. var db = await GetDbContextAsync();
  12. db.Set<TEntity>().Attach(entity);
  13. foreach (var item in fields)
  14. {
  15. db.Entry(entity).Property(item).IsModified = true;
  16. }
  17. return await db.SaveChangesAsync();
  18. }

更新实体,所有字段会被标记为修改
使用该方法建议先查询出来在给需要修改的字段赋值。当然修改之前通常会先查询一次,比如验证数据是否存在,数据所有权等,不能把别人的数据更新了撒。

  1. /// <summary>
  2. /// 更新实体
  3. /// 所有字段会被标记为修改,使用该方法建议先查询出来在修改需要的字段。当然修改之前通常会先查询一次,需要验证数据是否存在,数据所有权等。
  4. /// </summary>
  5. /// <param name="entity"></param>
  6. /// <returns></returns>
  7. public async Task<int> UpdateAsync(TEntity entity)
  8. {
  9. if (entity == null)
  10. throw new NullReferenceException("更新对象不能为空");
  11. var getDbContext = await GetDbContextAsync();
  12. getDbContext.Entry(entity).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
  13. return await getDbContext.SaveChangesAsync();
  14. }

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

TeachingNote

2020/5/16 12:55:21

自顶[熊猫]

是伍尚金哇_v

2020/11/17 16:57:02

感谢大佬分享

2020/11/17 17:48:51 回复

NET Core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

C out、rEF关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。out:classProgram { /* *out、ref都是引用传递,传递后使用都会改变...

Net Core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

EF6动态添加条件

例如我们要匹配一个集合中的所有关键字,我们首先想到的做法是这样的publicList&lt;Article&gt;GetArtByKeys(List&lt;strin...

Net Core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...

NET CORE配置EF连接字符串。windows验证的连接字符串配置

在appsettings.json中配置好连接字符串{&quot;ConnectionStrings&quot;:{ &quot;BloggingDatabase&quot;:&quot;Server=(lo...

使用REFit框架访问REST接口

改装是一个类型安全的REST开源库,是一套基于RESTful架构的.NET客户端实现,内部使用HttpClient类封装,可通过改装更加简单...

docker启动报错 No dEFault Boot2Docker ISO found locally downloading the latest

这是因为,启动时如果检测到没有 Boot2Docker,就会去下载,这个下载过程出现网络连接上的错误了,导致启动失败。可以去下...

扩展EF自动映射需要查询的字段(表达式树Expression),动态构建返回值

Entity Framework 动态构造select表达式比如我们需要返回某些字段会采用如下的写法但是发现每次都去写select如果字段很多不...

layer弹窗+EF引入独立页面进行操作

使用layer弹窗进行操作的时候我们可以使用type=2,来把一个独立的页面指向content内容例如我们有一个表格,点击添加后,我...

Entity Framework常用查询,EF joinEF多表联查,原生sql。EF 多表查询。AsNoTracking

直接执行sql语句//全表查询 List&lt;Users&gt;ulist=se.Database.SqlQuery&lt;Users&gt;(&quot;select*fromusers&quot;).T...

EF Code First常用命令

Enable-Migrations启用数据库迁移Enable-Migrations –EnableAutomaticMigrations 启动自动迁移Add-Migration Name(名字可...

EF Code First 多对多关系配置

Code First配置多对多关系,常规有两种方法例如我们有一张学生表,和一张课程表,学生和课程是一个多对多的关系方法1:单纯...

解决:基础提供程序在 Open 上失败,EF无法生成实体问题

在学校图书馆的电脑上安装VS2013和SQL R2后,调试项目报错:基础提供程序在 Open 上失败怀疑是数据库的问题,然后删除数据...

net core过滤器。net core过滤器中获取依赖注入对象。net core过滤器中使用依赖注入。ServicEFilter 

虽然对象都可以直接实例化得到。但是所有的对象依赖关系,都用DI容器去管理,这样后面想要更换对象的时候也非常方便,项目...

EF状态System.Data.EntityState的一点理解

System.Data.EntityState一共有五种状态分别是Added,Deleted,Modified,UnChanged,Detached下面给一个简单的解释System.Data...
这一生多幸运赶上过你.
排名
8
文章
221
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术