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

时间:2018-09-09 23:20:31

标签: c# entity-framework entity-framework-core

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

// 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为什么返回非持久数据,它是从哪里得到的?回滚是否应该删除它们?

1 个答案:

答案 0 :(得分:1)

因为您在某个上下文实例中,所以Assert中的查询将从同一实例加载,而不是直接查询数据库。

尝试其他实例或重新加载https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.changetracking.entityentry.reload?view=efcore-2.0