Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EntityFramework 5中使用事务?_C#_Mysql_Entity Framework_Visual Studio 2012_Entity Framework 5 - Fatal编程技术网

C# 如何在EntityFramework 5中使用事务?

C# 如何在EntityFramework 5中使用事务?,c#,mysql,entity-framework,visual-studio-2012,entity-framework-5,C#,Mysql,Entity Framework,Visual Studio 2012,Entity Framework 5,我想同时吃点东西。 如果一个人不成功,就必须全力以赴 诸如此类: ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall"); ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale"); ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale"); ctx.Database.ExecuteSqlCo

我想同时吃点东西。 如果一个人不成功,就必须全力以赴

诸如此类:

ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");
但问题是,我不知道如何使用这个事务

我试着这样做:

using (gasstationEntities ctx = new gasstationEntities(Resources.CONS))
{
    ctx.Database.Connection.Open();
    DbTransaction tr = ctx.Database.Connection.BeginTransaction();

    try
    {
        ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
        ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
        ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
        ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");
        //commit the transaction
        tr.Commit();
        new MessageWindow(this, Resources.GetString("Warn"), Resources.GetString("DeleteSuccess"));
    }
    catch (Exception ex)
    {
        //return
        tr.Rollback();
    }
    //close
    ctx.Database.Connection.Close();
}
这里的问题是:
tr.Commit()
例外情况告诉我:

{System.InvalidOperationException: Connection must be valid and open to rollback transaction
以及
tr.Rollback()将异常抛出到。
例外情况是:

{System.InvalidOperationException: Connection must be valid and open to rollback transaction
真正有趣的是,表截断是成功的。什么?commmit是抛出异常。它能成功吗?我不明白


请告诉我发生了什么事。如果您给我一个解决方案,那就更好了。

添加对
System.Transactions
的引用,使用System.Transactions导入

using (gasstationEntities ctx = new gasstationEntities(Resources.CONS))
{
   using (var scope = new TransactionScope())
   {
      [... your code...]

      scope.Complete();
   }
}
如果发生异常,则不调用scope.Complete(),并自动回滚

编辑:我刚刚看到了你的MySql标签。如果这不起作用,看看

试试这个, 从技术上讲,当没有异常时,用户应该提交事务,但如果出现异常,用户将自动回滚它

using (var txn = new TransactionScope())
{
    ctx.Database.ExecuteSqlCommand("truncate table tb_expensesall");
    ctx.Database.ExecuteSqlCommand("truncate table tb_wholesale");
    ctx.Database.ExecuteSqlCommand("truncate table tb_singlesale");
    ctx.Database.ExecuteSqlCommand("truncate table tb_purchase");
    txn.Complete();
}
new MessageWindow(this, Resources.GetString("Warn"), Resources.GetString("DeleteSuccess"));

你试过使用transactionscope吗?我同意将整个过程包装在TransactionScope中,它将为您处理。这里的一个问题是,
TRUNCATE
操作不会被记录(不像
DELETE FROM
),因此,无法在事务中包装。缺少提交:)并在显示消息之前关闭作用域。但TransactionScope在哪里?ef5 me找不到方法或属性。无法使用它。如果第二次抛出错误。首先是成功。为什么?@qakmak,添加对System.Transactions的引用。dll@qakmak:因此,使用良好的DLL引用和文件顶部的“
using System.Transactions;
”,它是否正常工作?但问题是,如果ExecuteSqlCommand2中存在异常。ExecuteSqlCommand1成功。如何让命令一起成功或不一起成功。对于exsample:ctx.Database.ExecuteSqlCommand(“truncate table tb_expensesall”);ExecuteSqlCommand(“truncate table tb_”);抛出新异常(“错误”);scope.Complete();如果有错误,则两个ExecuteSqlCommand succwss。为什么?作用域未执行方法完成。因此TransactionScope的Mysql事务问题可能尚未解决。。。如链接中所述,您可以尝试旧方法。看,旧的方法不能恢复到事务。我发现了问题所在。我们不能使用trancate表。我们必须使用删除表。现在我正在使用TransactionScope和实体框架。我只是将t-sql命令truancate table XX从XX改为delte。