MSLinqToSQLGenerator生成与SQLMetal不同的输出

时间:2009-08-06 21:30:57

标签: vb.net visual-studio linq-to-sql dbml sqlmetal

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

事实证明(在Microsoft的帮助下)SQLMetal生成的输出与IDE的MSLinqToSQLGenerator不同,因为DBML文件(由我创建的工具生成)有一些关系定义,父级可以访问子级,但是孩子们没有定义父关联。显然,您需要定义从子项到父项的关联(外键关系)。如果您只有从父级到定义的子级的关联,并且没有定义反向关联(或者反向关联具有不同的名称),则不会在任一方向上生成该关联的.NET源代码。对于MSLinqToSQLGenerator,这是正确处理的,但是SQLMetal显然没有执行那么多的验证,并且无论如何都会生成关联代码。 Microsoft已将此问题报告给开发。