【问题标题】:Rollback() but the query still getting new valueRollback() 但查询仍然获得新值
【发布时间】:2021-09-05 11:40:04
【问题描述】:

我将 .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 } 

mysql db里面的数据还是0因为数据回滚了,但是在

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

它仍然得到Value = 15

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

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

【问题讨论】:

    标签: c# .net-core entity-framework-core .net-5


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      试试_context.Database.UseTransaction(transaction)

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

      文档:Entity Framework Transactions

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-17
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 2022-01-01
        相关资源
        最近更新 更多