不要回滚 Entity Framework 中出错的事务

Don't rollback the transaction on error in Entity Framework

当 Entity Framework 操作发生错误时,任何环境事务都会中止,我无法将其用于更多的数据库工作。例如,一旦我尝试打开一个嵌套的事务范围,它就会抛出一个 TransactionAbortedException 说 "The transaction has aborted."

当我预计会出现错误并且知道如何继续时,我该怎么做才能防止这种情况发生?

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 实例。

SQL服务器没有记录什么类型的异常回滚事务。你不能让它不回滚,坦率地说这是愚蠢的,没有技术原因。它也很容易在出错的情况下简单地继续执行(然后没有事务)。此外,很难预测哪些类型的错误会回滚,哪些不会。

事务未被 EF 回滚。 SQL 服务器会这样做。

您可能可以通过异常处理执行原始 SQL:

TRY
 YourStatementHere
END TRY
CATCH
...

应该 保持交易活动。