使用自动回滚事务集成测试 EF Core 代码

问题描述 投票:0回答:1

我们对 ef 核心代码进行了集成测试,其中我们设置了始终回滚的事务:

internal class AutoRollbackTransaction : IDisposable
{
    private TransactionScope _transaction = null;

    public AutoRollbackTransaction()
    {
        _transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
    }

    public void Dispose()
    {
        if (_transaction != null) 
        {
            // intentionally not calling Complete();
            _transaction.Dispose();
        }
    }
}

然后我们的单元测试看起来或多或少像这样:

        using (var transaction = new AutoRollbackTransaction())
        {
            // arrange, act, assert
        }

但我现在已经开始使用 EF Core 临时表,显然这些历史记录仅在事务完成后才会保存。这确实有道理,但是有什么办法可以解决这个问题吗?我想继续使用自动回滚事务,并且不希望进行任何手动清理。

entity-framework-core integration-testing
1个回答
0
投票

显然那些历史记录只有在交易完成后才会被保存

这不是真的。历史记录立即创建,并遵循常规事务语义。

Entity Framework Core 中的时态表是在 SQL Server 系统版本控制的时态表 之上实现的。历史记录由SQL Server本身生成。

对于系统版本控制的时态表,SQL Server 会为每次数据修改 (

UPDATE
) 或删除 (
DELETE
) 插入历史记录。修改或删除本身会“原子地”发生这种情况。如果 UPDATE
DELETE
语句失败,则回滚其执行期间生成的历史记录插入。当包含
UPDATE
DELETE
语句的事务失败时,此类语句生成的历史记录插入也会回滚。
从事务角度来看,SQL Server 系统版本控制时态表没有什么特别之处。您可以继续使用自动回滚事务。

© www.soinside.com 2019 - 2024. All rights reserved.