首页 > 解决方案 > 使用 UpdateRange 方法时处理并发异常

问题描述

首先,我从数据库(Sql Server)中获得跟踪的项目列表。我有一个使用并发检查更新项目列表的方案。数据库中的每一行都有 rowversion 列,并配置了 fluent 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);
            }

        }
    }

标签: asp.netentity-frameworkasp.net-coreconcurrencyef-core-2.0

解决方案


即使有多个记录更改,异常也总是只有一个条目。(Ef 核心 2.1)

SaveChanges() 在事务中运行,但一次应用更改。在第一个并发错误之后,EF 不会继续尝试保存更改。


推荐阅读