【问题标题】:Entity Framework - reorder elements实体框架 - 重新排序元素
【发布时间】:2017-02-24 12:23:40
【问题描述】:

我只想更改两个元素的“订单”值,我有以下代码:

        int tmpItemOrder = item1.Order;
        item1.Order = item2.Order;
        item2.Order = tmpItemOrder;

        await _db.SaveChangesAsync();

但我遇到了唯一键问题(订单是唯一键)

{"违反 UNIQUE KEY 约束 'IX_EscortItems'。无法插入 对象“dbo.EscortItems”中的重复键。重复键值为 (2, 20)。\r\n语句已终止。"}

据我了解,当系统尝试在事务中设置重复键时,它会引发错误。奇怪的行为,但原样。

如何正确解决这个问题?

【问题讨论】:

  • 猜测一下,如果值是按顺序更新的,一旦设置了第一个值,它将立即违反唯一键约束。即使是两个SaveChanges 调用也会产生相同的效果。您可能必须使用中间唯一值。
  • 另一个想法是交换密钥是不寻常的,也许问题需要不同的方法 - 只是一个想法。
  • @PeterSmith,你是对的,即使两次 SaveChanges 调用也有相同的效果!

标签: sql sql-server entity-framework-6


【解决方案1】:

必须在每一行更新时遵守唯一性约束,而不仅仅是在事务完成时。尝试对行重新排序需要谨慎的算法。为了更新一行以获得所需的“订单”X,您必须首先确保 X 是空闲的(即,没有行已经有这个订单)。如果一行已经有这个所需的顺序,您必须通过将其更新为“免费”值来将其移出这个“槽”(我作为练习留给您确实找到了这样的“免费”值)。在更新“订单”之前,将其应用于每一行。

删除所有行然后以所需的“顺序”将它们插入回要简单得多

话虽如此,有许多 原因导致您不想在列中保留“顺序”。仅提及一个,您必须处理差距。

【讨论】:

  • 链接列表(即,为每一行保留一个“下一个项目 id”列)很容易更新,但很难按顺序查询(除非你愿意在应用程序中对客户端的项目进行排序,这对于小集合是可行的,例如发票或“购物车”)
  • 你也可以省略 UNIQUE 约束,它使更新变得微不足道,但你不放心引擎会捕捉到任何应用程序错误......
  • 当然,我可以省略唯一约束,但这是不正确的方法,唯一约束应该是:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2012-06-09
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多