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。