【问题标题】:EF core Unique Constraint violation, circular dependencyEF核心唯一约束违反,循环依赖
【发布时间】:2021-04-29 17:35:03
【问题描述】:

我有一个名为“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

只是我正在反转 Line items 的 SortOrder。

注意,SortOrder 不为空,唯一约束

当尝试从 EF 核心更新时,这会引发唯一约束错误,同时将第一个行项更新为第二个行项在数据库中的排序顺序为 2。 所以我想使用 UpdateRange(..) 进行批量更新,但这会引发如下所述的错误。

无法保存更改,因为在 要保存的数据:'LineItem [Modified]

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

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

我打算将 SortOrder 设为 null 并确保它在 Code 中不为 null... 这样我就可以用 null 更新所有 LineItems,然后用新值更新。(我还没有尝试过,为 Unique 约束设置 null 不是一个好主意,但这是我打算尝试的解决方法)

有什么方法可以让它保持“排序顺序为非空唯一列”吗?

【问题讨论】:

    标签: c# asp.net-core .net-core concurrency entity-framework-core


    【解决方案1】:

    我认为 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 查询来关闭和打开唯一约束。但这是非常不安全的,如果您的数据有错误,您将遇到很大的问题。此功能通常用于将数据从一个 db 或 table 迁移到另一个。

    【讨论】:

    • 谢谢@Sergey,这可能是一种可能的解决方法,但关于获取 MaxOrder 并添加的一件事是,它可能会在某个时候超出范围,每个可能有大约 500 个订单项(Bom_Fk, SortOrder) 组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2016-12-23
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多