使用事务还是SaveChanges(False)和AcceptAllChanges()?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (279)

我一直在调查交易,看来只要我通过,他们就会在EF中照顾自己。falseSaveChanges()然后打电话AcceptAllChanges()如果没有错误:

SaveChanges(false);
// ...
AcceptAllChanges();

在事务进行到一半的时候分配的任何indentiy列会发生什么情况?我想如果别人在我的记录坏了之前在我的记录里加了一个记录,那就意味着会有一个丢失的身份值。

有什么理由使用标准吗?TransactionScope在我的代码中?

提问于
用户回答回答于

大多数时候都是实体框架SaveChanges()就够了。

有时尽管SaveChanges(false) + AcceptAllChanges()配对是有用的。

也就是像这样不好的事情:

using (TransactionScope scope = new TransactionScope())
{
    //Do something with context1
    //Do something with context2

    //Save and discard changes
    context1.SaveChanges();

    //Save and discard changes
    context2.SaveChanges();

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

如果context1.SaveChanges()成功但context2.SaveChanges()失败,则整个分布式事务被中止。不幸的是,实体框架已经放弃了context1

但是,如果你将代码更改为如下所示:

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();
    context1.AcceptAllChanges();
    context2.AcceptAllChanges();

}

当呼唤SaveChanges(false)向数据库发送必要的命令,上下文本身不会更改,因此,如果需要,可以再次执行,或者可以询问ObjectStateManager如果你愿意的话。

这意味着,如果事务实际上抛出异常,则可以通过重新尝试或记录每个上下文的状态来补偿。ObjectStateManager在某个地方。

用户回答回答于

因为某些数据库可以在dbContextTransaction中抛出异常。最好是:

using (var context = new BloggingContext()) 
{ 
  using (var dbContextTransaction = context.Database.BeginTransaction()) 
  { 
    try 
    { 
      context.Database.ExecuteSqlCommand( 
          @"UPDATE Blogs SET Rating = 5" + 
              " WHERE Name LIKE '%Entity Framework%'" 
          ); 

      var query = context.Posts.Where(p => p.Blog.Rating >= 5); 
      foreach (var post in query) 
      { 
          post.Title += "[Cool Blog]"; 
      } 

      context.SaveChanges(false); 

      dbContextTransaction.Commit(); 

      context.AcceptAllChanges();
    } 
    catch (Exception) 
    { 
      dbContextTransaction.Rollback(); 
    } 
  } 
} 
用户回答回答于

所属标签

可能回答问题的人

  • HKC

    红客学院 · 创始人 (已认证)

    26 粉丝7 提问5 回答
  • Dingda

    Dingda · 站长 (已认证)

    4 粉丝0 提问3 回答
  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问3 回答
  • 螃蟹居

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券