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();
我将 .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();