Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 同一个表的多个外键_Linq_Linq To Sql_Foreign Keys_Sqlmetal - Fatal编程技术网

Linq 同一个表的多个外键

Linq 同一个表的多个外键,linq,linq-to-sql,foreign-keys,sqlmetal,Linq,Linq To Sql,Foreign Keys,Sqlmetal,我有一个参考表,其中包含性别、地址类型、联系人类型等的各种受控值查找数据。许多表都有多个外键指向该参考表 我还有多对多关联表,它们有两个外键指向同一个表。不幸的是,当这些表被拉入Linq模型并生成DBML时,SQLMetal不会查看外键列的名称或约束的名称,而只查看目标表。所以我最终得到了名为Reference1,Reference2。。。不太便于维护。例如: <Association Name="tb_reference_tb_account" Member="tb_referenc

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

我还有多对多关联表,它们有两个外键指向同一个表。不幸的是,当这些表被拉入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" />

目前用于LINQ的ms工具有一定的局限性,看起来vs 2010不会有太多的工作要做。您可以编写自己的代码生成器,查看或。我还找到了值得一看的地方。

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

public partial class tb_account
{
    public tb_reference shipping_preference_reference
    {
        get
        {
            return this._tb_reference.Entity;
        }
        set
        {
            this.tb_reference = value;
        }
    }
这远非完美。在大型模型中,它需要大量额外的代码,并且取决于属性的顺序是否不变(如果引用表的另一个外键被添加到account表中,则该成员实际上可能指向shipping首选项以外的内容)。
这也有好处。由于我已经在为其他目的编写分部类,添加这些成员并不需要重新构建应用程序。

我从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" />

在VS2010中,实际上可以在视图中重命名父级和子级的属性。不过这有点隐蔽

  • 在dbml查看器中,选择困扰您的关系
  • 在“属性”网格中,您将有两行“子属性”和“父属性”
  • 在那里展开它们,您可以更改属性的名称
  • 更多详细信息可在此处找到:


    这就是我得到它的地方。

    谢谢你的有趣链接。我查看了这两个模板——Damien的模板似乎不能满足我的需要。PLINQO似乎更易于配置,但需要Codesmith,而Codesmith不是免费的。我将尝试使用分部类的方法,以某种方式使用更有意义的名称公开这些成员。我还没有发现如何通过数据库的另一次往返更新来保存更改:(这似乎相关:
      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.
      ...