【问题标题】:How do I update a Linq to SQL dbml file?如何更新 Linq to SQL dbml 文件?
【发布时间】:2010-11-09 18:11:20
【问题描述】:

如何更新 Linq to SQL .dbml 文件?

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    有三种方法可以使模型保持同步。

    1. 从设计器中删除修改后的表,然后从数据库资源管理器将它们拖回设计器界面。我发现,要使其可靠地工作,您必须:

      一个。在数据库资源管理器中刷新数据库架构(右键单击、刷新)
      湾。删除表后保存设计器
      C。将表格拖回来后再次保存。

      注意尽管如果您修改了任何属性(例如,关闭关联的子属性),这显然会丢失这些修改 - 您必须再次进行修改。

    2. 使用 SQLMetal 从数据库重新生成架构。我看过许多显示how to script this 的博客文章。

    3. 直接在 DBML 的“属性”窗格中进行更改。这适用于简单的更改,例如允许字段为空。

    默认情况下,Visual Studio 2015、2017 或 2019 中未安装 DBML 设计器。您必须关闭 VS,启动 VS 安装程序并修改您的安装。 LINQ to SQL 工具 是您必须安装的功能。对于 VS 2017/2019,您可以在 Individual Components > Code Tools 下找到它。

    【讨论】:

    • 我在没有 1b 的情况下尝试了 1a 和 1c,在视图上执行简单选择时出现“指定的强制转换无效”错误。包括 1b 为我修复了它
    • 在 ​connect.microsoft.com/VisualStudio/feedback/details/260723/… 上请求了 VS 支持,但 MS 不想修复。
    • 尝试了第一种方法,成功了。猜猜它适用于小型数据库。
    • 让我痛苦的是,在 2019 年底,我需要在我知道什么是计算机编程之前创建一个答案……这太详细了,太棒了!
    【解决方案2】:

    要更新 .dbml 图表中的表,例如添加列,请执行以下操作:

    1. 更新您的 SQL Server Explorer 窗口。
    2. 将表的“新”版本拖到 .dbml 图表中(下图中的报告 1)。

    1. 在新版表格中标记添加的列,按Ctrl+C复制添加的列。

    1. 单击“旧”版本的表格,然后按 Ctrl+V 将添加的列粘贴到表格的现有版本中。

    【讨论】:

    • 这似乎是最简单、破坏性最小的方法,不需要额外的工具,并且在 VS2017 中运行良好
    • 这比公认的答案要少得多,并且在 2018 年底继续运行良好!
    • 这是快速(而不是快速编辑架构)的最佳答案。我花了很多时间使模型视图看起来不错。我讨厌删除和拖动更新文件。对于添加的字段,这非常有用!
    • 对我来说,这解决了两个问题。第一个是当我试图在表中复制和粘贴一个类似的字段然后重命名它时。这在验证时会产生不间断的“未指定”构建错误。另一个问题是,如果我删除了表,然后将其全部添加回来,则会导致 git 中的差异更大(因为对象在文件中重新排列)。用这种方法,我只看到新字段的插入,这样更干净,以后更容易理解。
    • 也许这是让它在 vs2019 上工作的最可靠和最简单的方法!谢谢。实际上,我尝试使用文本编辑器制作与这种方式相同的代码生成,但是 vs 无法构建!也许有缓存或其他东西。无论如何,这很好用!
    【解决方案3】:

    您还可以查看基于 CodeSmith 的 PLINQO 代码生成模板集,它允许您为 Linq-to-SQL 做很多巧妙的事情:

    • 为每个类生成一个文件(而不是一个巨大的文件)
    • 根据需要更新您的模型
    • 更多功能

    查看 PLINQO 网站http://www.plinqo.com 并观看介绍视频。

    我知道的第二个工具是Huagati DBML/EDMX tools,它允许更新 DBML(Linq-to-SQL)和 EDMX(实体框架)映射文件,以及更多(如命名约定等)。

    马克

    【讨论】:

    • 刚刚删除了 CodeSmith / PLINQO,我强烈建议反对采用这种方法。当然这个答案已经超过 4 岁了......
    • @Yuck:在这个时候,我强烈建议不要使用 Linq-to-SQL - 改用实体框架,这是更好的选择!
    • 是的。在验证应用程序可以使用普通 DBML 而不是 PLINQO 后迁移到 EF 是我清理旧应用程序的下一步。
    【解决方案4】:

    我们使用自定义编写的 T4 模板动态查询所有 .DBML 文件中每个表的 information_schema 模型,然后用数据库中的新模式信息覆盖 .DBML 文件的部分内容。我强烈建议实施这样的解决方案 - 它为我节省了大量时间,并且与删除表格并将其重新添加到模型中不同,您可以保持关联。使用此解决方案,您将在架构更改时收到编译时错误。不过,您要确保您使用的是版本控制系统,因为差异非常方便。如果您使用 DB 模式优先方法进行开发,这是一个很好的解决方案。当然,我不能分享我公司的代码,所以你自己写这个。但是如果你知道一些 Linq-to-XML 并且可以去学校on this project,你可以去你想去的地方。

    【讨论】:

      【解决方案5】:

      我建议使用 VS2008 中内置的可视化设计器,因为更新 dbml 也会更新为您生成的代码。在可视化设计器之外修改 dbml 会导致底层代码不同步。

      【讨论】:

      • 是的,但是 VS2008 中的可视化设计器无法检测和响应底层数据库中的更改 :-( 缺少删除和重新添加,不支持更新模型 :-(
      • 虽然确实如此,但问题非常模糊,并没有具体提及如何在数据库更改时更新模型。
      【解决方案6】:

      更新表然后更新 DBML 存在细微差别......如果对现有表进行更改,外键关系并不总是立即带来。解决方法是构建项目,然后再次重新添加表。我向 MS 报告了此问题,并且已针对 VS2010 进行了修复。

      DBML display does not show new foreign key constraints


      请注意,主要答案中给出的说明并不明确。更新表格

      1. 打开 dbml 设计界面
      2. 用右键->单击->全选或CTRLa选择所有表
      3. CTRLx(剪切)
      4. CTRLv(粘贴)
      5. 保存并重建解决方案。

      【讨论】:

      【解决方案7】:

      在存储过程更新的情况下,您应该将其从 .dbml 文件中删除并重新插入。但是如果存储过程有两个路径(例如:如果某事;显示一些列;否则显示一些其他列),请确保这两个路径具有相同的列别名!!!否则只会存在第一个路径列。

      【讨论】:

        【解决方案8】:

        这是对我有用的完整分步方法,用于更新 LINQ to SQL dbml 和关联文件以包含我添加到其中一个数据库表中的新列。

        您需要按照上述其他人的建议对您的设计表面进行更改;但是,您需要执行一些额外的步骤。以下是完整的步骤:

        1. 将更新后的表格从服务器资源管理器拖到设计图面上

        2. 将此“新”表中的新列复制到“旧”表中(有关此步骤的详细信息,请参阅 M463 答案)

        3. 删除刚刚拖过的“新”表

        4. 单击并突出显示存储过程,然后将其删除

        5. 将新的存储过程拖放到位。

        6. 删除 .dbml 代码隐藏中的 .designer.vb 文件 (如果你不删除它,你的包含模式的代码隐藏将 即使重建也不会更新,并且不会包含新的表字段)

        7. 清理并重建解决方案(这将重建 .designer.vb 文件以包含所有新更改!)。

        【讨论】:

          猜你喜欢
          • 2011-02-10
          • 2011-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多