当实体框架操作出现错误时,任何环境事务都会被中止,并且我无法将其用于更多的数据库工作。例如,当我尝试打开嵌套的事务范围时,它会抛出一个TransactionAbortedException异常,显示“事务已中止”。
如果我预计会出现错误并知道如何继续,我该怎么办?
如果有帮助的话,我可以创建一个新的
如果我预计会出现错误并知道如何继续,我该怎么办?
using (var scope = new TransactionScope())
{
using (var ctx = new MyContext())
{
try
{
var x = ctx.MyEntities.FirstOrDefault();
}
catch
{
CreateTable();
// Custom DDL command. I can't use EF migrations.
// Should that fail or not help, I'm happy to see more exceptions later.
}
// TODO: Transaction scope is already aborted!
ctx.MyEntities.Add(...);
}
scope.Complete();
}
如果有帮助的话,我可以创建一个新的
DbContext
实例。
CreateTable
调用作为处理错误的措施。另外,需要注意的是,数据库服务器已经中止了事务,而不是EF。 - ygoeSuppress
的另一个TransactionScope
解决了问题。我需要将可能失败的命令从事务中取出。由于它可能返回过时的数据,如果没有错误,我必须在事务内重复执行它并使用该结果。 - ygoe