分享 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 在实际开发中,如何分层?

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

相关推荐
步、步、为营1 小时前
.net开源库SignalR
开源·.net
追逐时光者3 小时前
一款开源免费、通用的 WPF 主题控件包
后端·.net
步、步、为营5 小时前
.net开源物联网项目IoTSharp
物联网·开源·.net
百锦再6 小时前
.Net配置文件appsetting.json的几种读取方法
chrome·json·.net·依赖注入·appsetting·web.config
昏睡红猹7 小时前
C#脚本化(Roslyn):如何在运行时引入nuget包
c#
张人玉7 小时前
C# 常量与变量
java·算法·c#
就是有点傻8 小时前
在C#中,可以不实例化一个类而直接调用其静态字段
c#
软件黑马王子8 小时前
C#系统学习第八章——字符串
开发语言·学习·c#
阿蒙Amon8 小时前
C#读写文件:多种方式详解
开发语言·数据库·c#