c# - 如何在 Entity Framework 中使用 LINQ-to-SQL 回滚事务?

标签 c# entity-framework linq transactions

这是我的代码:

TransactionScope trans = new TransactionScope();
dbDataContext db = new dbDataContext()
// did some insert
var user = new User();
user.ID = 1;
user.Name = "Nick";

db.Users.Add(user);

db.SubmitChanges();
trans.Complete();

现在,如果在保存更改时发生错误,我该如何回滚事务?

最佳答案

您可以通过两种方式在 Entity Framework 中使用事务。一个使用 TransactionScope,另一个使用数据库事务。

要使用数据库事务,请使用以下代码示例:

using (dbDataContext db = new dbDataContext())
using (var dbContextTransaction = db.Database.BeginTransaction()) 
{
    try
    { 
        var user = new User(){ID = 1, Name = "Nick"};
        db.Users.Add(user);
        db.SaveChanges();
        dbContextTransaction.Commit(); 
    } 
    catch (Exception) 
    { 
        dbContextTransaction.Rollback(); 
    }
} 

下面是 EF 的 TransactionScope 的示例:

using (TransactionScope tranScope = new TransactionScope())
using (dbDataContext db = new dbDataContext())
{
    try
    {
        var user = new User(){ID = 1, Name = "Nick"};
        db.Users.Add(user);
        db.SaveChanges();
        tranScope.Complete();
    }
    catch(Exception ex){}
}

如您所见,对于 TransactionScope,您不需要调用任何回滚方法。如果您不调用 Complete() 方法,则事务不会被提交并在被释放之前自动回滚。

关于c# - 如何在 Entity Framework 中使用 LINQ-to-SQL 回滚事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46628560/

相关文章:

c# - Linq SQL GroupJoin 错误

c# - Compact Framework/Threading - MessageBox 在选择选项后显示在其他控件之上

C# 条件日志记录/跟踪

c# - 为什么 Take() 返回的行数多于指定的行数?

c# - 错误 - 方法 'X.set_DbConnection(System.Data.Common.DbConnection)' 尝试访问方法 'Y.get_Settings()' 失败

c# - 无法将值 NULL 插入 EF 6.1.3 中的列

c# - 如何序列化 WCF 响应中的嵌套类型?

c# - 如何在 C# 应用程序中实现短信/短信/彩信

c# - 使用 Linq 搜索数据库

c# - 我可以在 LINQ 中获取两个 IEnumerables 的增量吗?