前言
  FreeSql 提供丰富的数据库更新功能,支持单条或批量更新,支持更新指定的字段,在特定的数据库执行还可以返回更新后的记录。与删除一样,没有条件的话不会执行,避免全表修改到全表;
 
 

指定列更新

_freeSql.Update<Student>(1)
.Set(x=>x.Name,"1111")
.ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0 WHERE([Id] = 1)
  更新很像直接写sql语句啊,直接使用主键更新,主键传入在Update()作为参数,赋值在Set()中;
 

条件更新

_freeSql.Update<Student>()
.Set(x => x.Name, "zz")
.Where(x => x.Id > 10)
.ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0 WHERE([Id] > 10)
 

实体更新(官方推荐)

  实体更新将值修改后传入Update()中,实现修改,修改过程中可以像新增操作一样指定列、忽略列,也可以忽略空列;如果指定了Set条件更新,SetSource实体更新会失效
var student = new Student { Id = 1,Name="zz" };
_freeSql.Update<Student>()
.SetSource(student)
.ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0, [Age] = @p_1, [Status] = @p_2, [AddTime] = @p_3, [Remark] = @p_4 WHERE([Id] = 1) _freeSql.Update<Student>()
.SetSourceIgnore(student, x => x == null)//忽略空列
.ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0, [Age] = @p_1, [Status] = @p_2, [AddTime] = @p_3 WHERE([Id] = 1)
 
 

指定列、忽略列

  与新增一样,修改操作可以指定要修改的字段或不要修改的字段,从而使修改操作更灵活
var student = new Student { Id = 1, Name = "zz", AddTime = DateTime.Now };
_freeSql.Update<Student>()
.SetSource(student)
.UpdateColumns(a => a.Name)
.ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0 WHERE([Id] = 1) _freeSql.Update<Student>()
.SetSource(student)
.IgnoreColumns(x => new { x.Age, x.Status })
.ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0, [AddTime] = @p_1, [Remark] = @p_2 WHERE([Id] = 1)
 
 

自定义SQL

  自定义Set中更新字段,直接指定需要更新的字段,给我的直观感受就是类似于参数化sql语句
_freeSql.Update<Student>()
.SetRaw("Name=@name,Age=@age", new { name = "zz", age = 10 })
.Where("Id=@id", 1)
.ExecuteAffrows();
//UPDATE [Student] SET Name=@name,Age=@age
//WHERE (Id=@id)
 

Dto更新

  将自定义实体传如Update(),根据实体拼接修改字段,如果实体中字段与Dto中字段不匹配,则忽略掉不匹配字段,有了dto更新就不用在new一个实体对象了
_freeSql.Update<Student>()
.SetDto(new { Name = "z", abc = 2 })
.Where(x => x.Id == 1)
.ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0 WHERE([Id] = 1)
 

字典更新

  有点像自定义更新,会将字典的key和value拼接成需要更新的值,如果数据库不存在字典的key字段会忽略掉
var dic = new Dictionary<string, object>();
dic.Add("Id", 1);
dic.Add("Name", "zz");
dic.Add("Addtime", DateTime.Now); _freeSql.UpdateDict(dic).AsTable(nameof(Student)).WherePrimary("Id").ExecuteAffrows();
//UPDATE [Student] SET [Name] = @p_0, [Addtime] = @p_1 WHERE([Id] = 1)
 
 
一个更新操作有这么多的方式实现,是不是有点迷糊了,首先是是Set/SetRaw,然后又有SetSource,最后又来个SetDto,区分一下吧~
 
Set/SetRaw  主要用于指定的字段更新,例如,一个大表上百字段,总不能new实体或者一个个全组装好吧。。
SetSource    主要用于已有实体对象,然后使用对象配合指定列、忽略列进行更新
SetDto       主要用于在已有目标值的Dto对象批量更新操作,想象下前后端互相传参的场景,下使用Dto去更新某些字段
 
 
 
 
 

FreeSql学习笔记——6.修改的更多相关文章

  1. WPF-学习笔记 动态修改控件Margin的值

    原文:WPF-学习笔记 动态修改控件Margin的值 举例说明:动态添加一个TextBox到Grid中,并设置它的Margin: TextBox text = new TextBox(); t_gri ...

  2. CUBRID学习笔记 6 修改用户密码

    修改密码 可以在web管理中修改. 还有另外两种体位 1  语句 ALTER USER user_name PASSWORD 'any_password_here_in_single_quotes'; ...

  3. MySQL学习笔记(5) - 修改和删除数据库

    1.完整语句 ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACHER SET [=] charset_name; 2.修改数据库的编码方式 al ...

  4. MySQL学习笔记(2) - 修改MySQL提示符的两种方法

    学习于慕课网 http://www.imooc.com/video/1806 1.方法一: cmd中处于未登录状态时,输入 mysql -uroot -p自己的密码 --prompt 新的提示符 示例 ...

  5. docker学习笔记:修改无法启动的容器中的内容

    我们可能会碰到这样的一个问题,在容器执行过程中,修改了容器的内容(如配置文件信息),但因为修改出了问题.导致容器关闭后,无法启动. 这事需要重新修改配置文件. 正常情况下可以通过 docker exe ...

  6. K8S学习笔记之修改K8S的api-server证书

    K8S的api-server证书包含很多IP和域名,有时候后期才发现证书内有错误,需要重新生成该证书. 修改server-csr.json,修改后基于原来的ca证书重新生成server.perm  s ...

  7. mongodb 学习笔记 2 --- 修改器

    修改器是为了爱update文档时,不需要传入整个文档就能修改当前文档的某个属性值,修改器用法如下: 假设数据库中foo集合中存在如下文档:{"name":"jack&qu ...

  8. Sharepoint2013搜索学习笔记之修改搜索拓扑(三)

    搜索服务新建好之后可以从管理中心,应用程序管理页面,进入搜索服务的管理页面,进入管理页面之后可以看到当前sharepoint场的搜索拓扑结构. 如果sharepoint场内有多台服务器,需要将搜索组件 ...

  9. 2017/01/20 学习笔记 关于修改和重打jar包

    背景 客户提供了jar包,但发现db表中缺少一个字段,db追加以后需要修改jar包中的source. 操作  如何修改jar包中的source并重新打一个新的jar包,做了如下操作. ① 开包 解压j ...

  10. git 学习笔记 ---撤销修改

    自然,你是不会犯错的.不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: $ cat readme.txt Git is a distributed version co ...

随机推荐

  1. 定时任务监控服务Healthchecks

    GitHub地址:https://github.com/healthchecks/healthchecks 官方文档:https://healthchecks.io/docs/ 按照步骤进行安装: 1 ...

  2. word 文档签章控件生成的签章批量删除

    某个签章工具的word插件缺少批量插入签章的功能.同时,发现在投标工具中可以使用导出生成pdf时批量签章的功能.现在需要移除先前手动操作生成的多个签章,有如下发现-- 1.对少量签章,可以先选中签章右 ...

  3. Sortable.js笔记

    1.前言 SortableJS是功能强大的JavaScript 拖拽库,更多配置项:Sortable.js中文网|配置 引入插件 <script src="https://cdn.bo ...

  4. 从Delphi到Lazarus——Lazarus开发环境使用入门教程

    0.前言 曾经有过更换开发环境体验的编程爱好者都会有同样的感受:打开新更换的开发环境后,看到陌生的界面无从下手.想写一段小程序试一试,却你找不到自己需要的组件在哪里. 其实,我们每到一个新地方,首先要 ...

  5. Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hover状态无法恢复的问题

    需求:QTtoolButton 鼠标移到按钮上时,弹窗菜单,并且点击菜单或者其他地方,菜单关闭后,按钮的hover状态需要恢复原状. 1. 创建按钮和菜单,并安装事件过滤器 m_Menu = new ...

  6. 【Android】谷歌应用关机闹钟 PowerOffAlarm 源码分析,并实现定时开、关机

    前言 RTC RTC 即实时时钟(Real-Time Clock),主要是功能有: 时间保持:RTC可以在断电的时候,仍然保持计时功能,保证时间的连续性 时间显示与设置:RTC可以向系统提供年.月.日 ...

  7. Flutter查漏补缺2

    Flutter的理念架构 Flutter架构分为三层 参考官方文档 Framework层(dart) flutter engine层(C/C++) embeder层(platform-specific ...

  8. 【Vue】vue项目搭建、ES6的简单使用(大觅)

    目录 项目搭建与基本配置 项目搭建 安装淘宝NPM镜像 cnpm 安装webpack 新建项目 运行项目 运行时出现的一些问题和解决方案 框架安装 安装UI框架iView 引入UI框架iView 引入 ...

  9. Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界面

    一.前言 这个系列对应自定义控件大全,一个专注于控件的编写,一个专注于UI界面的编写,程序员有两大软肋,一个是忌讳别人说自己的程序很烂很多bug,一个就是不擅长UI,基本上配色就直接rgb,对于第一点 ...

  10. 揭秘vivo百亿级厂商消息推送平台的高可用技术实践

    本文由vivo 互联网服务器团队Yu Quan分享,本文收录时有内容修订和重新排版. 1.引言 如今,Android端的即时通讯IM这类应用想实现离线消息推送,难度越来越大(详见<Android ...