代码之家  ›  专栏  ›  技术社区  ›  BlueMonkMN

mslinqtosqlgenerator生成的输出与sqlmetal不同

  •  1
  • BlueMonkMN  · 技术社区  · 15 年前

    我有一个相当大的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

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

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

    1 回复  |  直到 15 年前
        1
  •  2
  •   BlueMonkMN    15 年前

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