为什么 EF Core 中的 DbContext 在事务回滚后返回更改的实体

我想验证事务是否在出现异常的情况下回滚。下面的方法可能会引发异常。


// method Checkout(user, reduceMoney, addBill)

using (var transaction = _botContext.Database.BeginTransaction())

{

    try

    {

        await FirstDbUpdate(user, reduceMoney);

        await SecondDbUpdate(user, addBill); // potential exception


        transaction.Commit();

    }

    catch (Exception ex)

    {

        // ...

    }

}

为了验证回滚,我编写了这个测试:


[Test]

public async Task Test_TransactionFail_RevertedUserUpdate()

{

    // Arrange user{budget: 10}

    var user = await _userRepository.GetByName("John Doe");

    var reduceMoney = 10m;


    // Act - null causes an exception

    await _service.Checkout(user, reduceMoney, null);  


    // Assert

    var userRetrieved = await _userRepository.GetByName("John Doe");

    Assert.AreEqual(10, userRetrieved.Budget);

}

断言失败是因为用户的预算为 0。即看起来更改是持久的,但实际上并非如此(这是正确的行为)。


所以问题是为什么 DbContext 会返回未持久化的数据,它是从哪里得到的?回滚不应该删除它们吗?


幕布斯7119047
浏览 335回答 1
1回答

慕桂英3389331

因为您在某个上下文实例中,所以 Assert 中的查询将从同一个实例加载,而不是直接查询您的数据库。尝试使用其他实例或重新加载它https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.changetracking.entityentry.reload?view=efcore-2.0
打开App,查看更多内容
随时随地看视频慕课网APP