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>
  如果一个模块丢失,会因为一个异常而造成全部重试,有意义吗?

目录
相关文章
|
前端开发
return false得使用
return false得使用
49 0
|
缓存 算法 JavaScript
为什么[null] === [null]输出为false❓
有人问,为什么null === null 输出值true,但是[ null ] === [ null ]输出值却是false?
166 0
|
Python
a is b 为 True,a == b 一定为 True 吗?
a is b 为 True,a == b 一定为 True 吗?
121 0
|
存储 Java
今天我们来解决0.1d+0.2d==0.3d是false的问题!
今天我们来解决0.1d+0.2d==0.3d是false的问题!
今天我们来解决0.1d+0.2d==0.3d是false的问题!
a==b,b==c都为true,那a==c一定为true吗???
a==b,b==c都为true,那a==c一定为true吗???
a==b,b==c都为true,那a==c一定为true吗???
[]==![](true)、{}==!{}(false)
[]==![](true)、{}==!{}(false)
115 0
|
Java 程序员
for(;;)和while(true)的区别
for(;;)和while(true)的区别
138 0
for(;;)和while(true)的区别
|
Java 编译器 C语言
for(;;)和while(true)的区别
for(;;)和while(true)的区别
144 0
for(;;)和while(true)的区别
|
编译器
for( ; ; )和while(true)的区别
喜欢看源码的同学可能都会发现,很多组件的作者在做死循环时,都喜欢用for( ; ; ),while(true)或者while(1)也能实现死循环,为啥大佬们都用for( ; ; )呢
4389 0
for( ; ; )和while(true)的区别