在插入之前保留表中的 ID,以保持外键约束不变

本文关键字:约束 ID 插入 保留 | 更新日期: 2023-09-27 18:35:04

我有一个User表,它有一个自动递增的主键字段和一个Name字符串字段ID

我还有一个Email表,其中包含一个自动递增ID的主键字段、一个Value字符串字段和一个将电子邮件地址链接到特定用户的User_ID字段。它是User表的外键。

我的项目要求迫使我使用 Linq to SQL 开发一个 ASP.NET 页面,最终用户必须同时将用户和电子邮件添加到数据库中。

用户创建页将包含一个用于Name用户字段的文本框,以及一个启用 AJAX 的网格控件,用于为要创建的用户插入多个电子邮件地址。它还会在末尾有一个"创建"按钮。

启用 AJAX 的网格需要绑定到 Linq to SQL 表。

这里的问题是,在启用 AJAX 的网格中为用户创建电子邮件地址时,我还没有有效的用户 ID,因为我仍然必须通过按"创建"按钮来创建用户记录。

我看到了两种可能的解决方案,但它们既不令人满意又不优雅:

  1. 进入用户创建页面时,创建一个包含所有空字段的临时用户对象。这样,在启用 AJAX 的网格中添加电子邮件地址时,我将能够正确维护外键约束。

  2. 不要在电子邮件地址表中使用外键约束,并在创建有效的用户 ID 之前使用 null。创建用户 ID 后,我通过将 null 替换为新创建的 ID 来链接之前创建的电子邮件地址。

我相信这不是一个罕见的问题...有没有更优雅的解决方案?

在插入之前保留表中的 ID,以保持外键约束不变

在用户完成创建过程时,在服务器端存储电子邮件地址似乎是浪费精力。 为什么不将它们存储在本地,并在用户创建时将它们与其余数据一起传递?(您仍然可以通过 AJAX 进行验证)。

不过,如果您希望将它们存储在服务器上,我建议为没有外部约束的正在进行的创建电子邮件地址使用单独的表。 然后,在创建用户时从此表中获取电子邮件地址。

采用这种方法的原因:

  1. 不会通过删除约束来牺牲数据库完整性
  2. 不会通过在用户表中允许"垃圾"来牺牲数据库完整性
  3. 您可以实施定期运行的清理过程,以清理所有已添加但未继续使用的电子邮件(即创建者未单击"创建用户"按钮)