Linq to sql 在LINQ中对同一个表使用多个外键

Linq to sql 在LINQ中对同一个表使用多个外键,linq-to-sql,Linq To Sql,我有一个表用户和一个表项目 在Items表中,我有如下字段 修改 创造的 指派 它们都有一个userId整数。数据库设置为将这些作为外键返回到用户表 当使用LINQToSQL时,从dbml自动构建的关系最终会给我诸如User、User1和User2之类的名称 e、 g.myItem.User1.Name或myItem.User2.Name 显然,这不是很可读,我希望它是沿着 myItem.CreatedByUser.Name或myItem.ModifiedByUser.Name等 我可以更改关系

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

在Items表中,我有如下字段

修改 创造的 指派

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

当使用LINQToSQL时,从dbml自动构建的关系最终会给我诸如User、User1和User2之类的名称

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

显然,这不是很可读,我希望它是沿着

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

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


这有什么办法吗

首先,不。。。这些名称是基于关系中的第二个表创建的

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


对于我正在进行的项目,我们有200多张桌子。。。在从数据库中拖动它们之后,我们手动调整了大约50个。我们从不删除和重新拖动表,因为在自动生成后有太多的更改。

您可以使用linq to sql,而无需预先修改。这可能是额外的工作,但从更改表列名的角度来看,可能比您描述的更改dbml更容易。

简单的答案是:不

有人建议在定义属性名的地方创建部分关联类,但这也行不通:


您的选择是要么花一点时间“幕后”学习更多关于LINQ到SQL的知识,以便手动进行必要的修改,要么通过“属性”窗口更改属性名称。就我个人而言,我只是删除/redrag/rename,因为没有正确设置属性是调试的一大难题,因为抛出的异常几乎没有给您任何导致它的线索。我甚至创建了一个单元测试库,它接受模型中的每个元表对象,并验证字段计数、每个字段的ServerDataType内容、关联计数、每个关联的名称以及关联的每个端点的名称。每隔几次更改,我就会运行单元测试,以确保模型完好无损。

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

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

编辑:这似乎是相关的:

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

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

在本例中,
WTSR_归纳
表有两个指向
EmailTemplates
表的链接,因此,
EmailTemplate
EmailTemplate1
属性有点晚,但您可以通过选择linq模型上的关系并转到属性并更新父属性名称来实现这一点。

本博客提到了同样的问题,但解决方案不适合我,因为我一直在更改我的db架构和属性我不想每次更改时都要做很多手动操作,所以最好是删除并重新整理,因为至少更改的应用程序基于SqlMetal引擎是一致的。我宁愿使用“属性”窗口更改几个名称,也不愿错过设置自动同步属性,因为引发的异常对于如何解决它几乎没有提示。每个人都有自己的:)。。。它不是一个完美的系统(即LINQ到SQL),所以对您来说最简单的就是答案。我们和你一样做了,但最终它失控了。这有点难看,但在很多情况下可能是最好的解决方案。