1

我有一个相当大的 DBML 文件,最近发现 Visual Studio 的 MSLinqToSQLGenerator 生成的输出不同于:

SqlMetal.exe All.dbml /code:All.designer.vb /namespace:LINQ2FSE /pluralize /provider:SQL2005

它似乎已经从生成的 VB 代码中删除了一组任意(我认为相对较小)的关联。但 SQLMetal 工作正常。输出不应该相同吗?

经过进一步研究,我发现差异似乎是实体上的关联涉及属性,这些属性也用于具有不同列数的同一实体上的其他关联。例如: 实体 A 具有列 id 和 name 实体 B 具有列 id、name 和 fkA(A 的外键) 实体 C 具有列 id、name、fkA 和 fkB(可为空的 fkB)

实体 C 具有关联 C_A,将 fkA 链接到 A.id 它还具有关联 C_B,将 fkA 和 fkB 链接到 B.fkA 和 B.id

支持 C_B 的属性代码不会由 Visual Studio 生成,而是由 SqlMetal.exe 生成。

允许这种关联吗?代码生成方式不同是否有原因?

4

1 回答 1

2

事实证明(在 Microsoft 的帮助下)SQLMetal 生成的输出与 IDE 的 MSLinqToSQLGenerator 不同,因为 DBML 文件(由我创建的工具生成)定义了一些关系,其中父可以访问子代,但子代没有定义家长协会。显然,您需要定义从子到父的关联(外键关系)。如果您只定义了从父级到子级的关联,而没有定义反向关联(或反向关联具有不同的名称),则不会在任一方向生成该关联的 .NET 源代码。这对于 MSLinqToSQLGenerator 来说是正确处理的,但是 SQLMetal 显然没有执行太多的验证,并且无论如何都会生成关联代码。

于 2009-09-07T18:32:08.777 回答