【问题标题】:Multiple foreign keys to the same table同一张表的多个外键
【发布时间】:2009-09-20 15:39:17
【问题描述】:

我有一个参考表,其中包含性别、地址类型、联系人类型等的各种受控值查找数据。许多表对此参考表有多个外键

我还有一个多对多关联表,它们有两个外键指向同一个表。不幸的是,当这些表被拉入 Linq 模型并生成 DBML 时,SQLMetal 不会查看外键列的名称或约束的名称,而只会查看目标表。因此,我最终得到了名为 Reference1、Reference2 的成员……对维护不太友好。示例:

  <Association Name="tb_reference_tb_account" Member="tb_reference" <======
  ThisKey="shipping_preference_type_id" OtherKey="id" Type="tb_reference"
  IsForeignKey="true" />
  <Association Name="tb_reference_tb_account1" Member="tb_reference1" <======
  ThisKey="status_type_id" OtherKey="id" Type="tb_reference" 
  IsForeignKey="true" />

当然,我可以进入 DBML 并手动更改成员名称,但这意味着我不能再往返我的数据库架构。在模型的当前阶段,这不是一个选项,该模型仍在发展中。 将引用表拆分为 n 个单独的表也是不可取的。

我可能会编写一个脚本,在每一代之后针对 XML 运行,并将成员名称替换为从 ThisKey 派生的名称(因为我遵守这些类型的键的命名约定)。 有没有人找到更好的解决这个问题的方法?

【问题讨论】:

标签: linq linq-to-sql foreign-keys sqlmetal


【解决方案1】:

所以我选择了部分课程。例如,我添加了以下成员来处理原始示例中的第一个引用成员:

public partial class tb_account
{
    public tb_reference shipping_preference_reference
    {
        get
        {
            return this._tb_reference.Entity;
        }
        set
        {
            this.tb_reference = value;
        }
    }

这远非完美。它在大型模型中需要大量额外的代码,并且取决于属性的顺序不发生变化(如果将引用表的另一个外键添加到帐户表中,则该成员实际上可能指向其他东西而不是运输偏好)。 也有好处。由于我已经为其他目的编写部分类,因此添加这些成员不需要我重新架构应用程序。

【讨论】:

    【解决方案2】:

    在 VS2010 中,您实际上可以在视图中重命名父项和子项的属性。虽然有点隐蔽。

    1. 在 dbml 查看器中选择困扰您的关系。
    2. 在“属性”网格中,您将有两行子属性和父属性。
    3. 在那里展开它们,您可以更改属性的名称

    更多细节可以在这里找到: http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx

    这是我从哪里得到的。

    【讨论】:

    • 还没有找到让更改在数据库中的另一次往返更新中幸存下来:(
    【解决方案3】:

    当前用于 LINQ 的 ms 工具有些有限,看起来与 2010 相比不会付出太多努力。您可以编写自己的代码生成器,查看 Damien's t4 templatesPLINQO。我还找到了EDMDesigner,可能值得一看。

    【讨论】:

    • 感谢您提供有趣的链接。我看了两个 - Damien 的模板似乎没有做我需要的。 PLINQO 似乎更易于配置,但需要 Codesmith,它不是免费的。我将尝试使用部分类的方法,以某种方式以更有意义的名称公开这些成员。
    【解决方案4】:

    我来自 sqlmetal 的 xml 有更合理的默认值。不完美,但更好。 第一个 FK 获得了表名,但第二个 FK 获得了字段名。

      <Association Name="FK_Product_DefaultOutputTypeID" Member="OutputType"
       ThisKey="DefaultOutputTypeID" OtherKey="OutputTypeID" Type="OutputType"
       IsForeignKey="true" />
      <Association Name="FK_Product_DefaultTileOutputTypeID" Member="DefaultTileOutputType"
       ThisKey="DefaultTileOutputTypeID" OtherKey="OutputTypeID" Type="OutputType"
       IsForeignKey="true" />
    

    sqlmetal 版本:

      C:\Program Files\Microsoft Visual Studio 9.0\VC>sqlmetal /?
      Microsoft (R) Database Mapping Generator 2008 version 1.00.21022
      for Microsoft (R) .NET Framework version 3.5
      Copyright (C) Microsoft Corporation. All rights reserved.
      ...
    

    【讨论】:

      猜你喜欢
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2016-10-15
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多