在TransactionScope.Dispose()之后返回的缓存值

本文关键字:返回 缓存 之后 TransactionScope Dispose | 更新日期: 2023-09-27 18:27:04

我是集成测试的新手,我正在寻找一些关于解决问题的解释和建议:

我在测试中使用TransactionScope来保持数据库干净,并在每次测试前创建新的TransactionScope,并在每个测试后处理它:

 [SetUp]
    public void Init()
    {
        this.scope = new TransactionScope(
            TransactionScopeOption.Required,
            new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted },
            TransactionScopeAsyncFlowOption.Enabled);
        this.context = new SportsPerformanceDbContext();
        this.questRepo = new QuestionRepository(this.context);
    }
    [TearDown]
    public void CleanAll()
    {
        this.context.Dispose();
        this.scope.Dispose();
    }

当我运行一个测试类时,一切都正常。但是,当我运行至少两个测试类时,我遇到了一个问题:在这个测试中(见下文),lasrQuestionId等于数据库中的最后一个问题id-没关系,但actualResultId=id_of_the_last_aded_question_in_tests_with_transaction_scope+1:

[Test]
    public async void AddAsyncTest()
    {
        // Arrange
        var questionModel = new QuestionModel
        {
            //some properties
        };
        Question lastQuestion = this.GetLastQuestion();
        var lastQuestionId = lastQuestion?.Id ?? 0;
        // Act
        var addResult = await this.questRepo.AddAsync(questionModel);
        var actualResult = addResult.Value;
        // Assert
        Assert.AreEqual(lastQuestionId + 1, actualResult.Id);
        // some other assertions
    }

因此,我有以下内容,例如,lastQuestionId是5(数据库中有5个问题),但actualResultId下文scope.dispose()有问题。我不知道哪里有问题,你能解释一下我做错了什么吗?提前感谢!

this.GetLastQuestion()代码如下:

 private Question GetLastQuestion()
    {
        using (var ctx = new SportsPerformanceDbContext())
        {
            return ctx.Question
             .OrderByDescending(q => q.Id)
             .FirstOrDefault();
        }
    }

在TransactionScope.Dispose()之后返回的缓存值

这就是SQL Server引擎的工作方式:

对于具有特定种子/增量的给定标识属性,引擎不会重用标识值。如果某个特定的insert语句失败,或者insert语句被回滚,则所使用的标识值将丢失,不会再次生成。这可能会在生成后续标识值时导致间隙。