为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
幕布斯7119047 2022-01-09 16:39:07
我想验证事务是否在出现异常的情况下回滚。下面的方法可能会引发异常。// 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 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 326 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信