【问题标题】:Reserving an ID from a table before inserting to maintain foreign keys constraints intact在插入之前从表中保留 ID 以保持外键约束不变
【发布时间】:2015-02-20 19:16:21
【问题描述】:

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

我还有一个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 来链接先前创建的电子邮件地址。

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

【问题讨论】:

  • 请问您为什么不在电子邮件对象之前创建用户对象?此时,您可以在编写电子邮件对象之前将 UserID 插入到它们中
  • @Steve 忘了提到问题中的重要内容:启用 AJAX 的网格需要绑定到 Linq to SQL 表。我可以创建一个模仿 SQL 表架构的自定义数据源,但这似乎没有必要——必须有更好的解决方案
  • 为什么有这个要求。因为我会将它全部保留在会话中,并通过 Linq-2-sql 或者可能是一个简单的存储库一次性创建用户+电子邮件地址。您的要求是问题的核心——我真的不认为有任何需要这样的技术要求

标签: c# sql asp.net database linq-to-sql


【解决方案1】:

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

尽管如此,如果您希望将它们存储在服务器上,我建议为创建中的电子邮件地址创建一个单独的表,该表没有外部约束。然后,您可以在创建用户时从该表中获取电子邮件地址。

采用这种方法的原因:

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

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2021-12-09
    • 2021-10-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多