看到网上有很多转载这样的文章
但是在代码中并没有
context.SaveChanges(false)
以及
context.AcceptAllChanges()
请问是怎么回事。难道网上那些文章是虚假的吗
其次如果真遇到此问题该怎么办呢:就是有两个Context领域
//Do something with context1 //Save and discard changes context1.SaveChanges(); //Do something with context2 //Save and discard changes context2.SaveChanges();
想当context2.SaveChanges() 失败时 回滚context1.SaveChanges();应如何编写代码呢
using (TransactionScope scope = new TransactionScope()) { // do something... db.SaveChanges(); scope.Complete(); }
现在所有事务,不管是逻辑的还是ado的都被抽象到TransactionScope了,具体的你可以看看这个类的msdn解释,上面的两个方法都是过时的,这个类试用所有版本的EF。scope在complete前出现任何问题会自动rollback。
自己会回滚,不用显示 编写。
DbContext 是SaveChanges()
ObjectContext有一个SaveChanges(bool。。。)
他自己不会回滚的 已经测试过了。
那么用 code first 的 DbContext
就没办法了吗
@芒果の冰:
我倒没测试过,一直 说SaveChange就是一个事务,你贴代码看看
嵌套
using(var tran1 = context1.Connection.BeginTransaction()) { using(var tran2 = context2.Connection.BeginTransaction()) { try{ tran2 .Commit(); tran1.Commit(); } catch { tran2 .Rollback(); tran1.Rollback(); } } }
用 DbContext 呢 不存在这个属性啊
Connection.BeginTransaction()
@芒果の冰: 是 DB.BeginTransaction(),而不是 DB.Connection.BeginTransaction()
(DB即DbContext)
using (IDbTransaction transaction = DB.BeginTransaction())
{
1 using (IDbTransaction transaction = DB.BeginTransaction()) 2 { 3 try 4 { 5 6 transaction.Commit(); 7 } 8 catch (Exception) 9 { 10 transaction.Rollback(); 11 } 12 }
这样就可以在EF中使用事物了!
transaction.Commit();
transaction.Rollback(); }