【问题标题】:Using Multiple Foreign Keys to the same table in LINQ在 LINQ 中对同一个表使用多个外键
【发布时间】:2010-04-02 10:00:33
【问题描述】:

我有一个表格 Users 和一个表格 Items

在 Items 表中,我有诸如

之类的字段

修改者 由...制作 分配给

它们都有一个 userId 整数。数据库设置为将这些作为外键返回到用户表。

使用 LINQToSQL 时,从 dbml 自动构建的关系最终会给出像 User、User1 和 User2 这样的名称

例如myItem.User1.Name 或 myItem.User2.Name

显然这不是很可读,我希望它符合

myItem.CreatedByUser.Name 或 myItem.ModifiedByUser.Name 等

我可以更改关系的名称,但这意味着每次更改 db 架构并刷新 dbml 时我都必须重做。

有没有办法解决这个问题?

【问题讨论】:

标签: linq-to-sql


【解决方案1】:

简单的答案:不。

有人建议在定义属性名称的地方创建部分关联类的想法,但这也行不通:Renaming LINQ 2 SQL Entity Properties Through Partial Classes

您的选择是花一点时间了解更多关于 LINQ-to-SQL“幕后”的信息,以便您可以手动进行必要的修改,或者只是通过“属性”窗口更改属性名称。就我个人而言,我只是删除/重新拖动/重命名,因为没有正确设置属性是调试的痛苦,因为抛出的异常让你几乎不知道是什么原因造成的。我什至创建了一个单元测试库,该库获取模型中的每个 MetaTable 对象并验证字段计数、每个字段的 ServerDataType 内容、关联计数、每个关联的名称以及每一端的名称该协会。每隔几次更改,我都会运行单元测试以确保模型完好无损。

【讨论】:

    【解决方案2】:

    首先,不...名称是根据关系中的第二个表创建的。

    但您应该知道的是,您不必“刷新”(即删除 DBML 中的表,然后重新拖放)。

    对于我正在处理的项目,我们有 200 多个表......其中大约 50 个是我们在从数据库中拖动它们后手动调整的。我们从不删除和重新拖动表格,因为在自动生成后发生了如此多的变化。

    【讨论】:

    • 对我来说,最好删除和重新拖动,因为至少,更改的应用程序基于 SqlMetal 引擎是一致的。我宁愿使用“属性”窗口更改几个名称,也不愿错过设置 AutoSync 属性,因为抛出的异常几乎不会为您提供有关如何解决它的线索。
    • 每个人都有自己的 :) ... 这不是一个完美的系统(即 LINQ to SQL),所以对您来说最简单的就是真正的答案。我们的做法和你一样,但最终失控了。
    【解决方案3】:

    我只是添加一个小的部分类来扩展具有适当命名属性的对象,示例如下:

    namespace Database.TableModels {
        partial class WTSR_Induction {
            public EmailTemplate ConfirmationEmailTemplate {
                get { return EmailTemplate1; }
            }
            public EmailTemplate InviteEmailTemplate {
                get { return EmailTemplate; }
            }
        }
    }
    

    在本例中,WTSR_Inductions 表有两个指向EmailTemplates 表的链接,因此有EmailTemplateEmailTemplate1 属性。

    【讨论】:

    • 这有点难看,但在许多情况下可能是最好的解决方案。
    【解决方案4】:

    有点晚了,但您可以通过选择 linq 模型上的关系并转到属性并更新父属性名称来做到这一点。

    【讨论】:

      【解决方案5】:

      您可以在没有dbml 的情况下使用 linq to sql,这可能需要额外的工作,但从更改表列名称的角度来看,它可能比更改 dbml 更容易,正如您所描述的那样。

      【讨论】:

        【解决方案6】:

        我建议创建扩展方法,将您想要的名称映射到您从自动生成的代码中获得的名称。这样每次自动生成后,您不必更改自动生成的代码,而只需更改您自己的扩展方法。再加上本页其他地方建议的进行完整性检查的单元测试应该可以正常工作。

        我自己刚刚遇到了这个问题,我要尝试实施我自己的建议。

        编辑:这似乎相关: SQLMetal Multiple Foreign Keys Pointing to One Table Issue

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          • 2016-01-07
          • 2021-04-07
          • 1970-01-01
          • 2017-06-01
          • 2016-12-23
          相关资源
          最近更新 更多