在LINQ中使用多个外键到同一个表

时间:2010-04-02 10:00:33

标签: linq-to-sql

我有一个表用户和一个表项

在Items表中,我有

等字段

ModifiedBy 由...制作 AssignedTo

都有userId整数。数据库设置为将这些作为外键返回到Users表。

使用LINQToSQL时,从dbml自动构建的关系最终会给我一些名称,如User,User1和User2

e.g。 myItem.User1.Name或myItem.User2.Name

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

的要求

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

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

这有什么办法吗?

6 个答案:

答案 0 :(得分:1)

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

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

对于我正在进行的项目,我们有超过200个表...我们在从数据库中拖动它们后手动调整了50个表。我们从不删除并重新拖动表格,因为自动生成后有很多变化。

答案 1 :(得分:1)

简单的回答:不。

有人提出了创建部分关联类的想法,其中定义了属性名称,但这也不起作用:Renaming LINQ 2 SQL Entity Properties Through Partial Classes

您的选择是花一点时间了解LINQ-to-SQL“幕后”,以便您可以手动进行必要的修改或只通过“属性”窗口更改属性名称。就个人而言,我只是删除/重新标记/重命名,因为没有正确设置属性是一个痛苦的调试,因为抛出的异常几乎没有任何线索,因为它是什么导致它。我甚至创建了一个单元测试库,它接受模型中的每个MetaTable对象,并验证字段计数,每个字段的ServerDataType内容,关联计数,每个关联的名称以及每个结尾的名称。该协会。每次更改,我都会运行单元测试以确保模型完好无损。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

有点晚了但你可以通过选择linq模型上的关系并转到属性并更新父属性名称来实现。

答案 4 :(得分:0)

你可以在不使用dbml的情况下使用linq到sql它可能是额外的工作,但是从更改表名列的角度来看,它可能比你所描述的dbml更容易。

答案 5 :(得分:0)

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

我自己刚刚面对这个问题而且我想尝试实施自己的建议。

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