gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:11:07 24 4
gpt4 key购买 nike

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

// 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 返回未持久化的数据,它是从哪里得到的?回滚不应该删除它们吗?

最佳答案

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

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

关于c# - 为什么 EF Core 中的 DbContext 在事务回滚后返回已更改的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52249384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com