我们对 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 中的时态表是在 SQL Server 系统版本控制的时态表 之上实现的。历史记录由SQL Server本身生成。
对于系统版本控制的时态表,SQL Server 会为每次数据修改 (
UPDATE
) 或删除 (DELETE
) 插入历史记录。修改或删除本身会“原子地”发生这种情况。如果 UPDATE
或 DELETE
语句失败,则回滚其执行期间生成的历史记录插入。当包含 UPDATE
或 DELETE
语句的事务失败时,此类语句生成的历史记录插入也会回滚。从事务角度来看,SQL Server 系统版本控制时态表没有什么特别之处。您可以继续使用自动回滚事务。