【问题标题】:Saving details before master?在主人之前保存细节?
【发布时间】:2015-04-07 23:33:06
【问题描述】:

我有一个名为 Bank 的表,其中存储银行信息,例如名称、帐户、子公司/分行。对于输入子公司/分支机构,我使用的是同一张表,并包括自引用的 ParentId、IsSubsidiary、IsBranch 字段。表结构如下:

Field            Type
---------------------------
BankId           int (PK)
Name             nvarchar(100)
AccountNo        nvarchar(50)
ParentId         int (self-referencing key)
IsSubsidiary     bit
IsBranch         bit

所以我正在制作一个 C# 应用程序来捕获这些信息,并且我想重用相同的表单来捕获辅助数据。 例如:

输入父级:银行 A
进入银行A的分行:银行B和银行C

问题是在输入银行A的数据时,用户想输入其分行(银行B和银行C)的详细信息,那么当用户尚未保存银行A数据时,如何生成ParentId?

【问题讨论】:

    标签: c# sql logic


    【解决方案1】:

    对此有多种解决方案,其中之一是为 BankId 字段使用 uniqueidentifier 数据类型(我假设您使用的是 SQL Server)。这样,您可以在 C# 中使用 Guid.NewGuid() 生成一个 Guid,并将其用作 ID,然后再保存任何记录。

    也就是说,更好的解决方案可能是缓存任何更改并以正确的顺序保存内容。先救父母,再救孩子。

    【讨论】:

    • 将数据类型更改为 uniqueidentifier 对我来说不是一个选项,因为此表已与许多其他表链接。你能提供更多关于我如何使用缓存来实现这一点的信息吗?
    • 我所说的“缓存”只是将数据保存在应用程序中的变量中以供以后使用,这样一旦您保存了父项,您就可以稍后保存子项。如果您需要使用 SQL Server int 标识列作为 ID,我认为没有其他选择。您可以尝试查询数据库以猜测下一个 ID 将是什么,然后使用它,但我认为这是非常糟糕的做法,除非您禁用任何外键(也是不好的做法),否则它无论如何都不会工作。
    【解决方案2】:

    不确定如何将记录插入数据库。一种解决方案是使用“输出”。当您插入BankA时,您可以获得带有inserted.BankID输出的id

    【讨论】:

    • 接口是这样的
    • 对我来说,最后拯救 BankA 确实是一个糟糕的方法。如果是这种情况,(我假设 BankID 由 DB 分配),您将需要更新 ParentID 作为最后一步。
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多