使用 UpdateRange 方法时处理并发异常
Handling Concurrency Exception When Using UpdateRange Method
首先,我从数据库(Sql 服务器)获得了一个跟踪的项目列表。
我有一个使用并发检查更新项目列表的场景。
数据库中的每一行都有 rowversion 列,并配置了流畅的 api IsRowversion() 方法。
在为列表中的每个项目编辑一些属性后,使用断点我为 sql 服务器中的每一行手动更改一列以抛出异常。
但是即使有多个记录更改,异常也总是只有一个条目。
(EF 核心 2.1)
public async Task UpdateWithConcurrency<T>(List<T> items, CancellationToken ct) where T : class, new()
{
foreach (var item in items)
item.GetType().GetProperty("DateModified").SetValue(item, DateTime.Now);
List<T> databaseEntries = new List<T>();
_context.UpdateRange(items);
try
{
await _context.SaveChangesAsync(ct);
}
catch (DbUpdateConcurrencyException ex)
{
var errors = ex.Entries; // ==> The count is always one even
// even with changes in each row
foreach (var errorEntry in errors)
{
var databaseItem = await errorEntry.GetDatabaseValuesAsync();
databaseEntries.Add(databaseItem.ToObject() as T);
}
}
}
the exception always has just one entry even with multiple records changes. (Ef core 2.1)
SaveChanges() 在事务中运行,但一次应用一个更改。在第一个并发错误后,EF 不会继续尝试保存更改。
首先,我从数据库(Sql 服务器)获得了一个跟踪的项目列表。 我有一个使用并发检查更新项目列表的场景。 数据库中的每一行都有 rowversion 列,并配置了流畅的 api IsRowversion() 方法。
在为列表中的每个项目编辑一些属性后,使用断点我为 sql 服务器中的每一行手动更改一列以抛出异常。 但是即使有多个记录更改,异常也总是只有一个条目。 (EF 核心 2.1)
public async Task UpdateWithConcurrency<T>(List<T> items, CancellationToken ct) where T : class, new()
{
foreach (var item in items)
item.GetType().GetProperty("DateModified").SetValue(item, DateTime.Now);
List<T> databaseEntries = new List<T>();
_context.UpdateRange(items);
try
{
await _context.SaveChangesAsync(ct);
}
catch (DbUpdateConcurrencyException ex)
{
var errors = ex.Entries; // ==> The count is always one even
// even with changes in each row
foreach (var errorEntry in errors)
{
var databaseItem = await errorEntry.GetDatabaseValuesAsync();
databaseEntries.Add(databaseItem.ToObject() as T);
}
}
}
the exception always has just one entry even with multiple records changes. (Ef core 2.1)
SaveChanges() 在事务中运行,但一次应用一个更改。在第一个并发错误后,EF 不会继续尝试保存更改。