#39073·efcore

在元素具有嵌套复杂集合的复杂集合变短后,在跟踪实体上进行更新时发生 ArgumentOutOfRangeException

作者: icecactus创建于 2026年9月23日更新于 2026年9月26日
标签area-change-trackingarea-complex-types

QQ 错误描述

在履带实体上调用更新 ' ,在下列情况下投出超出距离的参数 ' :

  1. 实体有一套复杂的集合,其元素类型有一套复杂的集合(`命令')。 直线,每行有 " 部分 " ;内部列表可以是空的),
  2. 外部收集的物品现在比实体开始被跟踪时少,
  3. " DbSet. Update " / " Update Range " / " DbContext " 。 请该实体提供最新情况。

通过 " 探测变化 " 工程节省的同样变化:实体被修改。 当外列表增长时,当列表中的项目没有巢集时,也会起作用.

我们通过一个通用的"更新许多"寄存器帮助器来打击它. 报告将 " 最新消息 " 称为 " 最新消息 " ,而不检查这些实体是否已追踪到:

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? public async 任务更新ManyAsync( IEnnumerable 实体, bul 自动保存 = 假) { var dbContext = 正在等待 GetDbContext Async (); dbContext.Set (). Update Range(实体). 向箭头( ) ; 如果(自动保存) { 等待 dbContext 。 (笑声) 保存 ChangesAsync (); (中文(简体) ). {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


早些时候在同样的背景下对这些实体进行了跟踪,并在通话前用较短的清单取而代之。

这看起来接近于已固定于10.0.6的37585和37724,但仍在10.0.12上再生.

您的代码

不需要数据库。 连接从未打开 。

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
使用微软. 实体框架公司;

//抛出:行项有嵌入式复合集合;行得到更短;再更新.
运行( “ 线( 项有嵌入式收藏) ), 然后更新), 上下文 QQ
{
var 顺序 = 新命令 { Id = 1,行 = [新线 {名称 = "a" }, 新线 {名称 = "b" };
上下文。 附加( 顺序 ) ;
秩序。 秩序。 行= [新行{名称="a"};
上下文。 更新( 顺序 ) ;
* ;

// Works:相同更改,未更新而检测出.
运行( “短线, 仅检测变化 ” ),上下文 QQ
{
var 顺序 = 新命令 { Id = 2,行 = [新行 {名称 = "a"}, 新行 {名称 = "b"}};
上下文。 附加( 顺序 ) ;
秩序。 秩序。 行= [新行{名称="a"};
上下文。 变换跟踪器。 检测变换 ();
* ;

//工程: 标记项没有嵌入式收藏; 标记缩短; 然后更新 。
运行( “标签( 平面项) ) 较短, 然后更新), 上下文 QQ
{
var 顺序 = 新命令 { Id = 3, Tags = [新标记 { 名称 = "a"}, 新标记 { 名称 = "b"}};
上下文。 附加( 顺序 ) ;
秩序。 秩序。 标记=[新标记{名称="a"};
上下文。 更新( 顺序 ) ;
* ;

//Works:行得到更长的时间,然后更新.
运行( “长度更长, 然后更新” ), 上下文 QQ
{
var 顺序 = 新命令 { Id = 4,行 = [新行 {名称 = "a"}}};
上下文。 附加( 顺序 ) ;
秩序。 秩序。 行= [新行{名称="a"},新行{名称="b"};
上下文。 更新( 顺序 ) ;
* ;

静态空空运行( 字符串名称, 动作 < AppContext > 正文)
{
使用 var 上下文 = 新的 AppContext ();
尝试 {正文(context); 控制台. WriteLine ($"OK {name}");}
抓取( 例外 e) { Console. WriteLine ($"THROWS {名) :
. . . . . . .