Rollback() 但查询仍然获得新值

Rollback() but the query still getting new value

我将 .NET 5 与 EF Core 5.0.5 和 Pomelo Mysql 5.00 一起使用。

我用这段代码测试交易:

public async Task<IActionResult> TestTransaction()
{
    var listTester = await _context.Tester.ToListAsync();
    using var transaction = _context.Database.BeginTransaction();

    try
    {
        for (int i = 0; i <= 5; i++)
        {
            listTester.ForEach(x =>
            {
                x.Value += i;
            });
            _context.SaveChanges();
        }

        transaction.Rollback();
        var newLister = await _context.Tester.ToListAsync();
        return Ok(newLister);
    }
    catch (Exception)
    {
        // TODO: Handle 
        return BadRequest("Data failed");
    }
}

我有资料

new Tester(){ Name = "test", Value = 0 } 

代码完成后我收到了列表

new Tester(){ Name = "test", Value = 15 } 

mysqldb里面的数据因为数据回滚还是0,但是在

var newLister = await _context.Tester.ToListAsync(); 

它仍然得到 Value = 15

为什么rollBack()没有影响当前数据?

注意:我想在每个循环上测试 SaveChanges(),我知道我可以在循环完成后放置 SaveChanges。但我也想测试一下 ;)

尝试_context.Database.UseTransaction(transaction)

这将强制 EF 使用声明的事务,而不是在您每次调用 _context.SaveChanges() 时隐式创建一个内部事务。

文档:Entity Framework Transactions

注意:内部创建的每个事务都会在保存后提交更改,因此需要使用您的事务。

您必须清除缓存的实体。 EF 不会重新加载已修改的实体。 EF Core 5 有这种可能性:

...
transaction.Rollback();
_context.ChangeTracker.Clear();