首先,我从Database(Sql Server)获得了跟踪的项目列表。 我有一个方案来使用并发检查更新项目列表。 数据库中的每一行都有rowversion列,并使用流利的api IsRowversion()方法进行配置。
在为列表中的每个项目编辑了一些属性后,使用一个断点,我为sql server中的每一行手动更改了一列以引发异常。 但即使更改了多个记录,该异常也始终只有一个条目。 (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);
}
}
}
答案 0 :(得分:0)
即使更改了多个记录,该异常也始终只有一个条目。 (Ef核心2.1)
SaveChanges()在事务中运行,但是一次应用更改。发生第一个并发错误后,EF不会继续尝试保存更改。