SaveChanges(false)

这是做项目的时候遇到的一个问题,搜了半天,找到一篇英文博客做了相关介绍,自己看了还是不太懂,一下是我对原文的一些翻译,有不恰当之处请大家批评指正。

很多时候EF实体框架可以为您管理事务。

每次在你的.NET代码中添加一个实体,删除一个实体,修改一个实体,传建一个关系或者删除一个关系。都通过EF来保存,当你调用SaveChange()函数时,就会转换成原生的SQL语句,并在数据库中执行事务。

一下这些情况你需要使用自己的事务:

1.在同一个事务中,使用对象上下文把一个消息放到消息队列中。

2.同时使用两个对象上下文。

3.等等等等,你懂得……

一旦出现更严重的错误,并且不在EF框架范围内,你想要恢复的话就需要使用环境事务(TransactionScope)。

如果你调用SaveChange()或者SaveChange(true),那么EF就会直接的认为一切顺利,然后就会放弃对于更改的追踪,并等待新的更改。

这样的话一旦事务的其他地方出现错误,由于我们放弃了对于更改的追踪,导致我们将不能够再恢复。

接下来介绍SaveChange(false)和AcceptAllChanges()。

SaveChange(false)告诉EF必需执行的数据库命令,但坚持更改(这里我也不太理解原话是:but hold to the changes),所以如果有必要可以重载。现在如果整个事务失败,你可以重试EF特定位,或者调用SaveChange(false)。再或者你可以通过状态管理来记录哪里失败了。

一旦更多的事务执行成功,你只是直接调用AcceptAllChanges(),然后被追踪的变化就会丢失。

典型的伪代码如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;">using (TransactionScope scope = new TransactionScope())
{
    //Do something with context1
    //Do something with context2

    //Save Changes but don't discard yet
    context1.SaveChanges(false); 

    //Save Changes but don't discard yet
    context2.SaveChanges(false);

    //if we get here things are looking good.
    scope.Complete(); 

    //If we get here it is save to accept all changes.
    context1.AcceptAllChanges();
    context2.AcceptAllChanges();

}</span>

如果一个模块丢失,会因为一个异常而造成全部重试,有意义吗?

时间: 2024-08-04 16:39:44

SaveChanges(false)的相关文章

Entity Framework - Using Transactions or SaveChanges(false) and AcceptAllChanges()?

LINK With the Entity Framework most of the time SaveChanges() is sufficient. This creates a transaction, or enlists in any ambient transaction, and does all the necessary work in that transaction. Sometimes though the SaveChanges(false) + AcceptAllCh

Excel VBA

================ Sub 下拉() Application.ScreenUpdating = False Dim mybook As Workbook Set mybook = Workbooks("汇总.xlsx") Dim target As Workbook Workbooks.Open "C:\Users\jacky\Desktop\政策落地执行表\李晓.xlsx" Set target = Workbooks("李晓.xlsx&q

js导出execl兼容ie Chrome Firefox各种主流浏览器(js export execl)

第一种导出table布局的表格 <html> <head> <meta charset="utf-8"> <script type="text/javascript" language="javascript"> var idTmr; function getExplorer() { var explorer = window.navigator.userAgent; //ie if(explore

VSTO:使用C#开发Excel、Word【7】

                        第2章Office解决方案介绍 Office解决方案的三种基本模式现在,您了解Office对象模型的基本模式,本章将介绍开发人员如何模拟和构建其Office解决方案. 使用Office构建的大多数解决方案都遵循三种模式之一 Office 自动化执行 Office 加载项 Office 文档背后的代码 一个自动化可执行文件是一个独立于Office控制和自动化Office应用程序的程序.可以使用Visual Studio等开发工具创建自动化可执行文件.

javscript 导出html中的table到excel

<script language="JavaScript" type="text/javascript"> /* * 默认转换实现函数,如果需要其他功能,需自行扩展 * 参数: * tableID : HTML中Table对象id属性值 * 详细用法参见以下 TableToExcel 对象定义 */ function saveAsExcel(tableID){ var tb = new TableToExcel(tableID); tb.setFontS

将Table内容转为Excel下载

使用:method1(table); 说明:参数table为table元素的ID; var idTmr; function getExplorer() { var explorer = window.navigator.userAgent ; //ie if (explorer.indexOf("MSIE") >= 0) { return 'ie'; } //firefox else if (explorer.indexOf("Firefox") >=

VBA文件处理

Option Explicit ' ▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ ' Excel对象 ' △△△△△△△△△△△△△△△△△△ ' Open Public Function FileOpen_ByExcel(ByVal FileName As String, ByRef Target As Workbook) As Boolean On Error GoTo OpenFileError Set Target = Workbooks.Open(FileName:=FileName, Rea

.Net之路(十三)数据库导出到EXCEL

.NET中导出到Office文档(word,excel)有我理解的两种方法.一种是将导出的文件存放在server某个目录以下,利用response输出到浏览器地址栏,直接打开:还有直接利用javascript来导出html中的标签. 1.javascript导出 function AllAreaWord(areaId) { var myDate = new Date(); //日期函数 try { var fileName = myDate.getYear() + (myDate.getMont

【转】这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>html 表格导出道</title> <script language="JavaScript" type="text/javascript"> //第一种方法 function method1(table