使用TransactionScope不会重新设置标识列

Jas*_*ans 3 .net database unit-testing transactions

我已经开始使用TransactionScope来帮助我进行单元测试,以便将我的测试数据库恢复到之前的状态.使用这个与SpecFlow,我有一个像这样的基类:

public class TransactionScopedFeature
{
    private TransactionScope Scope { get; set; }

    [BeforeScenario]
    public void BaseSetup()
    {
        this.Scope = new TransactionScope(TransactionScopeOption.RequiresNew);
    }

    [AfterScenario]
    public void BaseCleanup()
    {
        if (this.Scope != null)
        {
            this.Scope.Dispose();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所有上述工作,当我向数据库添加记录时,当我在测试完成后查询表时,这些表是空的.伟大的东西,非常聪明!

我的问题与这些表中的标识列有关.我注意到的是,当我多次运行我的测试时,我的测试表的ID列增加1.我假设由于TransactionScope将回滚更改,因此身份种子也将被回滚.

我做错了这个假设 - 这就是数据库的工作原理吗?如果是这种情况,我也可以在每个执行此操作的方案之前运行SQL脚本:

DBCC CHECKIDENT ('dbo.Items', reseed, 0)

我只是想检查一下我做错了什么,或者这是正常的数据库行为.

干杯.雅.

Mic*_*ito 7

标识列的种子值不会与SQL Server中的其余事务一起回滚.

这是设计使得在交易的整个持续时间内不必将专用锁定放在柜台上以用于身份.