分享 2 个 .NET EF 6 只更新某些字段的方法

前言

EF 更新数据时,通常情况下,是更新全部字段的,但实际业务中,更新全部字段的情况其实很少,一般都是修改其中某些字段,所以为了实现这个目标,很多程序员通常会这样作:

  1. 先从数据库中查询出实体对象,
  2. 然后修改其中某些字段字段的值,
  3. 最后再把整个实体对象的数据重新保存到数据库。

这样做性能很低,也不安全,那些不需要修改的字段的数据有可能这个过程中受到破坏。

其实有更好的作法的,本文抛砖引玉,分享 2 个 .NET EF 6 只更新某些字段的更好的方法。

代码

  1. 方法1: 更新数据不更新一些字段,留意注释

    c# 复制代码
    public void UpdateSomeField(int id)
    {
    	// 1. 先查询实体
    	var user = DbContent.t_user.Where(o => o.id == id).FirstOrDefault();
    	
    	// 2. 再修改字段的值
    	user.name = "周";
    	user.age = 1;
    	
    	// 3. age 属性不想修改,标记其 IsModified 属性 = false
    	// ---- 设置容器空间某一个模型的某一个字段 不提交到数据库
    	// ---- DbContent.Entry 是要更新到数据库的整个对象
    	
    	DbContent.Entry<t_user>(user).Property("age").IsModified = false;
    	
    	// 4. 更新数据
    	DbContent.SaveChanges();
    }
  2. 方法2: 直接添加模型更新,留意注释

    c# 复制代码
    public void UpdateSomeField(int id)
    {
    	// 1. 直接创建对象修改到数据库 不用先查询
    	t_user user = new t_user()
    	{
    		id = id,
    		name ="周",
    		age=1,
    
    	};
    	
    	// 2. 将实体对象加入 EF 对象容器中 获取容器对象
    	DbEntityEntry<t_user> entry = DbContent.Entry<t_user>(user);
    	
    	// 3. 容器对象状态设置为 unchanged
    	entry.State = System.Data.EntityState.Unchanged;
    	
    	// 4. 设置被改变的属性  是否要提交到数据库的字段
    	entry.Property(a => a.name).IsModified = true;
    	entry.Property(a => a.age).IsModified = true;
    	
    	// 5. 更新数据
    	DbContent.SaveChanges();
    }

总结

更新数据是实际业务中经常遇到的场景,可以进一步封装以上的方法,通过参数传递要修改或不修改的字段,提高 EF 6 的性能。你有更好的方法吗?欢迎分享讨论!

往期精彩

  1. 分享一个 .NET EF 6 扩展 Where 的方法
  2. 分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
  3. 分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子
  4. 不会使用 EF Core 的 Code First 模式?来看看这篇文章,手把手地教你
  5. EF Core 性能很差?试试这 6 个小技巧
  6. 如何在 EF Core 中使用乐观并发控制
  7. EF Core 在实际开发中,如何分层?

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步

相关推荐
技术支持者python,php2 小时前
winform本地上位机-ModbusRTC1.上位机控制台与数据监控(数据监控架构思维与图表系列)
c#
kalvin_y_liu4 小时前
DeploySharp开源发布:让C#部署深度学习模型更加简单
深度学习·开源·c#
c#上位机5 小时前
wpf之GroupBox
c#·wpf
CodeCraft Studio5 小时前
国产化PDF处理控件Spire.PDF教程:C#中轻松修改 PDF 文档内容
前端·pdf·c#·.net·spire.pdf·编辑pdf·修改pdf
mit6.8245 小时前
[C# starter-kit] Domain Entities | `AuditableEntity`基类 | 跟踪变化 | 软删除
数据库·microsoft·c#
李宥小哥12 小时前
C#基础11-常用类
android·java·c#
偶尔的鼠标人14 小时前
Avalonia中,使用DataTable类型作为DataGrid的ItemSource 数据源
ui·c#·avalonia
R-G-B16 小时前
【02】大恒相机SDK C#开发 —— 初始化相机,采集第一帧图像
c#·大恒相机sdk·大恒相机初始化·大恒相机采集图像
韩立学长18 小时前
【开题答辩实录分享】以《制造型企业供应商档案管理系统设计与开发》为例进行答辩实录分享
sqlserver·c#
ajassi20001 天前
开源 C# 快速开发(十七)进程--消息队列MSMQ
windows·开源·c#