Linq to SQL - 撤销所有未提交的改动
在某些情况下我们需要撤销/丢弃所有未提交的改动,包括Update, Delete和Insert。context中GetChangeSet()方法可以返回当前所有未提交的改动,而我们的目标是清空Change Set。
撤销Update很简单,通过OverwriteCurrentValues的模式刷新,context中缓存的初始值以及改动后的对象都会被数据库中最新的值覆盖。
对于Insert,只要再调用一次DeleteOnSubmit的方法即可在ChangeSet中移除对象。
Delete则需要首先Refresh一次,然后InsertOnSubmit。
重要的是在这个过程中Linq to SQL会自动比较缓存的初始对象及更新后的对象,操作在内存中进行,并不会产生任何Insert/Update/Delete的数据库操作。
下面代码使用Extension Method将DiscardPendingChanges方法附加到DataContext对象中
- public static class DataContextExtensions
- {
- /// <summary>
- /// Discard all pending changes of current DataContext.
- /// All un-submitted changes, including insert/delete/modify will lost.
- /// </summary>
- /// <param name="context"></param>
- public static void DiscardPendingChanges(this DataContext context)
- {
- context.RefreshPendingChanges(RefreshMode.OverwriteCurrentValues);
- ChangeSet changeSet = context.GetChangeSet();
- if (changeSet != null)
- {
- //Undo inserts
- foreach (object objToInsert in changeSet.Inserts)
- {
- context.GetTable(objToInsert.GetType()).DeleteOnSubmit(objToInsert);
- }
- //Undo deletes
- foreach (object objToDelete in changeSet.Deletes)
- {
- context.GetTable(objToDelete.GetType()).InsertOnSubmit(objToDelete);
- }
- }
- }
- /// <summary>
- /// Refreshes all pending Delete/Update entity objects of current DataContext according to the specified mode.
- /// Nothing will do on Pending Insert entity objects.
- /// </summary>
- /// <param name="context"></param>
- /// <param name="refreshMode">A value that specifies how optimistic concurrency conflicts are handled.</param>
- public static void RefreshPendingChanges(this DataContext context, RefreshMode refreshMode)
- {
- ChangeSet changeSet = context.GetChangeSet();
- if (changeSet != null)
- {
- context.Refresh(refreshMode, changeSet.Deletes);
- context.Refresh(refreshMode, changeSet.Updates);
- }
- }
- }
调用时:
- DataContext context = new DataContext();
- //Do insert/delete/update
- context.DiscardPendingChanges(); //Will clear DataContext.ChangeSet
- context.SubmitChanges(); //Nothing will be submit
Linq to SQL - 撤销所有未提交的改动的更多相关文章
- Git 撤销所有未提交(Commit)的内容
撸了好多代码,但是突然设计改了(~~o(>_<)o ~~):或者引入个第三方库,后来又发现用不着,想删掉,但文件太多了(比如几百个):那,怎么办呢,都不想了...Git 比人聪明,所以能很 ...
- SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
- 的Linq未提交之前插入/修改时重新查询不准确问题
来园子已经两年了,每次都是看,这次咱也写一次. 说一下今天遇到的Linq问题: 每一次插入流水表时,都需要查找表中最大的流水号+1,并且将该流水号返回,但是在同一个SubmitChange之内插入多条 ...
- sql 查看 锁定的表 或者 未提交 的事务
--查看锁定的 表select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sy ...
- 年终巨献 史上最全 ——LINQ to SQL语句
LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...
- LINQ to SQL语句(13)之开放式并发控制和事务
Simultaneous Changes开放式并发控制 下表介绍 LINQ to SQL 文档中涉及开放式并发的术语: 术语 说明 并发 两个或更多用户同时尝试更新同一数据库行的情形. 并发冲突 两个 ...
- LINQ To SQL
议程 1.LINQ To SQL概述 2.LINQ To SQL对象模型 3.LINQ To SQL查询 用到的数据库 SQL Server 2005,数据库名为Test. 两张表,分别为Studen ...
- LINQ TO SQL 大全
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 LINQ to SQL语句(1)之Where 适用场景: ...
随机推荐
- Python目录整合
一.python基础篇 二.网络编程篇&&并发编程篇 三.数据库篇 -mysql -redis -mongodb 四.前端篇 -html -css -js jquery&&am ...
- application/x-protobuf payload加密 知乎
- 一个非常棒的jQuery 评分插件--好东西要分享
现在做网页已经不仅限于实现功能了,更多的是要实现功能的同时追求更加美观的实现.比如页面上让用户评分的功能,你完全可以放5个RdioButton让用户选择分数,也可以用DropDownList来实现,但 ...
- javaScript 调用构造函数 Array() 时没有使用参数, length总是0
如果调用构造函数 Array() 时没有使用参数,那么返回的数组为空,length 字段为 0. 当调用构造函数时只传递给它一个数字参数,该构造函数将返回具有指定个数.元素为 undefined 的数 ...
- Jacl 是 TCL 的一个备用实现
Jacl 是 TCL 的一个备用实现,它是完全使用 Java 代码编写的. wsadmin 工具使用 Jacl V1.3.2. 建议不要在 wsadmin 工具中使用 Jacl 语法 建议不要使用一个 ...
- 配置stun服务器实现穿墙
Turn服务器的配置流程 Webrtc是基于P2P的,在两个客户端建立连接之前需要服务器建立连接,这时两台设备一般都处于一个或者多个NAT中,那么两台设备建立连接就需要穿墙技术. 这时就用到了turn ...
- centos7 设置mongodb远程连接
/etc/mongod.conf 更改 bindIp: 127.0.0.1 为 bindIp: 0.0.0.0
- 2D游戏中的碰撞检测:圆形与矩形碰撞检测(Javascrip版)
一,原理介绍 这回有点复杂,不过看懂了还是很好理解的.当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我. 我们首先来建立一个以圆心为原点的坐标系: 然后要检 ...
- python学习笔记(十二)python操作redis
1.python要操作redis 首先需要安装redis模块,然后导入才能使用 安装:pip install redis 导入:import redis 2.连接redis r = redis.Red ...
- 素数判断 - C语言实现
除了1和自身之外不能整除其它数, 称之为素数. 最小的素数是2. 没有最大的素数. 1000以内素数, 如下图所示: 关于素数的算法, 一般有2种. 第1种, 给出一个数n(n >= 2), 判 ...