c# - 在 C# 中使用 Entity Framework、Mysql 和 LINQ to SQL 提交和回滚事务

标签 c# mysql entity-framework linq-to-sql transactions

我的问题是transaction没有正常工作,如果在trascation期间发生异常,它不应该为一个表保存数据

当所有表都正确后才保存数据。

请考虑以下事项:

databaseEntites objEntites = null;  
using (objEntites = new databaseEntites())  
{
     objEntites.Connection.Open();  
     using (System.Data.Common.DbTransaction transaction = 
         objEntites.Connection.BeginTransaction())
     {
         try
         {  
             customer objcust=new customer();  
             objcust.id=id;  
             objcust.name="test1";  
             objcust.email="test@gmail.com";  
             objEntites.customer.AddObject(objcust);  

             order objorder=new order();  
             objorder.custid=objcust.id;  
             objorder.amount=500;  
             objEntites.order.AddObject(objorder);  

             objEntites.SaveChanges();  
             transaction.Commit();  
         }  
         catch()  
         {  
             transaction.Rollback();  
         }  
     }  
}

在此我的第二个表列名称不正确并且在 SaveChanges() 上给出异常。

当我查看数据库并发现它为客户表保存数据时,这是错误的,我希望当所有表都正确时,数据将进入客户表,并且此 savechanges 要么为所有表保存,要么不为任何表保存。

为此,我还尝试了 TransactionScope

using (TransactionScope tscope = 
    new TransactionScope(TransactionScopeOption.RequiresNew))
{
......all the code here....
    objEntites.SaveChanges(false);

    tscope.Complete();
    objEntites.AcceptAllChanges();
}

但它给出了与上述相同的问题。

提前致谢。

最佳答案

您可以使用数据库事务或 EF TransactionScope。要使用数据库事务,只需执行以下操作:

using (var dbContextTransaction = context.Database.BeginTransaction()) 
{
  try
  {
    //Some stuff
    dbContextTransaction.Commit(); 
  } 
  catch (Exception) 
  { 
    dbContextTransaction.Rollback(); 
  }
} 

并且使用 EF TransactionScope 只需使用的第二种方式,如下所示:

using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
    {  
      try
      {
        //Some stuff
        scope.Complete(); 
      } 
      catch (Exception) 
      { 
         //Don't need call any rollback like method
      }
    } 

关键是 TransactionScope 中不存在 Rollback() 方法(针对普通的 ADO.NET 事务),除非您调用 Complete() 方法,否则事务不会完成并且所有更改都会自动回滚。更好理解可以看MSDN:http://msdn.microsoft.com/en-us/data/dn456843.aspx

希望对你有帮助

关于c# - 在 C# 中使用 Entity Framework、Mysql 和 LINQ to SQL 提交和回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17448689/

相关文章:

C# 位图为 Format8bppIndexed 设置像素值

php - SQL 查询查找所有两个单词组合

php - PDO 多个命名占位符不检索数据

c# - 用于有状态应用程序的 ORM。 EF适合吗?或者任何?

.net - 关于用 Entity Framework 替换企业库数据访问 block 的建议

c# - 在 Entity Framework 保存时修剪字符串

c# - EntityFramework 6 基于代码的数据库优先连接字符串配置

c# - WebApi DI Autofac - 确保 Controller 具有无参数公共(public)构造函数

c# - 单击鼠标按钮如何在 WinForms 事件中结束?

mysql - Hibernate 多对多映射和查询