使用 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 不会继续尝试保存更改。