我的问题是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/