同一个表的多个外键

时间:2009-09-20 15:39:18

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

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

我还有多对多关联表,它们有两个外键到同一个表。不幸的是,当这些表被拉入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派生的内容替换成员名称(因为我遵守这些类型的键的命名约定)。 有人找到了解决这个问题的更好方法吗?

4 个答案:

答案 0 :(得分:3)

所以我走了部分班级路线。例如,我添加了以下成员来解决原始示例中的第一个引用成员:

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

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

答案 1 :(得分:3)

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

  1. 在dbml viewer中选择困扰你的关系。
  2. 在“属性”网格中,您将有两行Child和Parent Property。
  3. 在那里展开它们,您可以更改属性的名称
  4. 更多细节可以在这里找到: http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx

    我从哪里得到它。

答案 2 :(得分:2)

当前用于LINQ的ms工具是有限的,并且看起来并不像2010年那样会有太大的努力。您可以编写自己的代码生成器,查看Damien's t4 templates或{{3} }。我还发现PLINQO可能值得一看。

答案 3 :(得分:0)

来自sqlmetal的我的xml有更明智的默认值。不完美,但更好。 第一个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.
  ...