EF core 唯一约束冲突,循环依赖

3
我有一个名为“LineItem”的表,其中包含“SortOrder”和“Bom_Fk”列,并且这些列上有唯一键约束。
假设该表有以下2行:
 ID | SortOrder| Bom_Fk 
 1  | 1        | 122
 2  | 2        | 122

现在,我将以下行更新为:

ID | SortORder| Bom_Fk
1  | 2        | 122
2  | 1        | 122

我只是在反转行项目的SortOrder。

请注意,SortOrder不为null,并具有唯一约束条件。

当尝试从EF core更新时,这会在更新第一行项目时抛出唯一约束错误,因为第二行项目已经在数据库中具有2的排序顺序。所以我考虑使用UpdateRange(..)进行批量更新,但是这会引发如下所述的错误。

由于在要保存的数据中检测到循环依赖关系,因此无法保存更改:'LineItem [Modified] <-\r\nIndex { 'BomFk', 'SortOrder'} LineItem [Modified] <-\r\nIndex { 'BomFk', 'SortOrder' } LineItem [Modified]。 要显示其他信息,请调用“DbContextOptionsBuilder.EnableSensitiveDataLogging”。

用于更新此表的代码...

 lineItemsToUpdate.Add(lineItem);
 context.LineItems.UpdateRange(lineItemsToUpdate);

我计划将SortOrder设置为null,并确保它不是从代码中的null值...

这样我就可以更新所有具有null值的LineItems,然后再用新值更新。(我还没有尝试过这个方法,因为在唯一约束条件下使用null并不是一个好主意,但这是我计划尝试的解决方法)

是否有任何方法可以使'Sort Order'列保持为非空唯一列?

1个回答

0

我认为sortorder值是1、2、3还是101、102、103并不重要。我通常使用数百或数千来表示。在这种情况下,只需将项目从一个位置移动到另一个位置即可。

因此,您可以尝试这个方法。

var maxSortOrder= context.LineItems.Max(i=>i.SortOrder);

foreach(var item in lineItemsToUpdate)
{
maxSortOrder+=1;
item.SortOrder=maxSortOrder;
}

之后您可以保存该范围。

如果 sortOrder 值很重要,在保存后您可以再次使用任何数字进行排序。

另一种方法是使用原始的 SQL 查询来关闭和开启唯一约束。但这非常不安全,如果数据中出现错误,将会遇到大问题。通常情况下,此功能用于从一个数据库或表迁移数据到另一个。


谢谢您,@Sergey。这可能是一个可行的解决方案,但关于获取MaxOrder并添加到其中的一件事是,在某个时刻它可能超出范围,每个(Bom_Fk,SortOrder)组合中可能会有大约500个行项目。 - RashmiMs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接