asp.net - 使用 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);
}
}
}
解决方案
即使有多个记录更改,异常也总是只有一个条目。(Ef 核心 2.1)
SaveChanges() 在事务中运行,但一次应用更改。在第一个并发错误之后,EF 不会继续尝试保存更改。
推荐阅读
- excel - 微调将日期添加到单元格后的显示方式
- string - SSRS:如何将表达式添加到仅接受字符串的属性?
- javascript - 获取宽度元素
(SVG) 在添加到 svg 之前使用 js - javascript - JWT 子声明在验证期间被忽略
- javascript - 这些 Jquery 示例之间有什么区别?
- netsuite - 如何在 SuiteScript 2 Suitelet 中将 NetSuite 文件作为字节数组获取?
- matlab - 求解复合线性优化问题
- r - 在 group_walk() 中调用多个函数
- c# - 数据表服务器端处理排序功能只工作一次
- c# - 从发布堆栈跟踪中定位异常