微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从和到跨度按正确顺序更新,以避免与以前的值发生相交冲突

如何解决从和到跨度按正确顺序更新,以避免与以前的值发生相交冲突

所以我有一个列表,列出了一些年龄范围,如下所示:

[{ From: 0,To: 3,Name: "baby"},{ From: 4,To: 17,Name: "child"},{ From: 18,To: 64,Name: "adult"},{ From: 65,To: 99,Name: "senior"}]

如果我想操作年龄范围并更新它们,我将遍历每个对象并更新到我们的数据库。唯一的问题是,在执行此操作时,我们在数据库中有一个约束,以确保没有年龄范围相互交叉。例如,当我将第一个对象 To 属性更改为 5 并将第二个对象 From 属性更改为 6 时,这就会发生,因为我们还没有更新第二个对象对象。

虽然在整个更新完成时这是合法的,但当我循环遍历每个对象并一个一个地更新它们时这是不合法的。

现在我不知道除了蛮力之外最有效的方法来执行此操作,更新每个对象,如果失败,则将其重新添加到更新列表中并继续这样做,直到没有剩下的为止。但我相信有更聪明的方法

那么有什么方法可以根据其原始值或对列表中下一个和上一个对象的一些检查来确定应该首先更新哪个对象?

编程语言在这里并不重要,因为我试图了解其背后的逻辑,但我使用的是 C#。

Graph of blocks collide on update 此处提供的图形只是更新方式的示例。

更新:

我们从只执行单个更新到在局部视图中执行多个更新,这就是我们遇到这个问题的原因。

Screenshot of the modal that is responsible for the data that is being sent to the action

因此,它只是一个相当简单的操作,循环遍历对象,然后使用调用 oracle 数据库中的存储过程的更新方法

public ActionResult Update(VmPersonAge model){
     try {
          conn.open();
          foreach (var personAge in model.PersonAges) {
               personAge.Update(conn);
          }
     } finally {
          conn.Close();
     }
     return RedirectToAction("Tickets");
}

更新2: 我对这个问题有一个解决方案,但它并不漂亮。所以我有这个方法可以在循环的动作中使用,如果它失败了,它会将它添加一个新列表中,然后重试直到没有剩余,但它又不漂亮,也不正确。

private void UpdatePersonAges(List<CPersonAge> PersonAges,OracleConnection Conn){
     List<CPersonAge> updateList = new List<CPersonAge>();
     foreach (var personAge in PersonAges)
     {
          try
          {
               personAge.Update(Conn);
          }
          catch
          {
               updateList.Add(personAge);
          }
     }
     if (updateList.Any())
     {
          UpdatePersonAges(updateList,Conn);
     }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。