如何将Linq更新为SQL dbml文件?


Answers:


258

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

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

    一个。在数据库资源管理器中刷新数据库架构(右键单击,刷新)
    b。删除表格后保存设计器
    c。向后拖动表格后再次保存。

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

  2. 使用SQLMetal从数据库重新生成架构。我看过许多博客文章,这些文章显示了如何编写脚本

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

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


1
我对1a和1c尝试了不带1b的尝试,并且在视图上执行简单选择时遇到“指定的转换无效”错误。包括1b为我修复的问题
tomfumb


尝试了第一种方法,它起作用了。猜猜它对一个小型数据库有效。
Muhammedh 2014年

让我感到痛苦的是,在2019年底,我需要一个答案才能知道计算机编程是什么...这是如此详细和出色!
PSGuy

54

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

  1. 更新您的SQL Server资源管理器窗口。
  2. 将表的“新”版本拖到.dbml-diagram中(下图中的report1)。

report1是表的新版本

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

复制添加的列

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

将添加的列粘贴到表的旧版本中


4
这似乎是最简单,破坏力最小的方法,不需要任何额外的工具,并且在VS2017中正常工作
Toby

1
这比公认的答案要容易得多,并且在2018年底仍然可以正常工作!
标记

1
这是快速(而不是快速编辑模式)的最佳答案。我花了很多时间使模型视图看起来不错。我讨厌删除和拖动更新文件。对于添加的字段,效果很好!
哈克

1
对我来说,这解决了两个问题。第一个是当我尝试在表中复制并粘贴类似的字段,然后重命名它时。验证时会产生不间断的“未指定”构建错误。另一个问题是,如果我删除了表,然后将其全部添加回去,则会导致git的差异大得多(因为在文件中重新布置了对象)。使用这种方法,我只会看到新字段的插入,这更干净,以后也更容易理解。
goug

顺便说一句,当它提示您“要添加到设计器中的对象使用与设计器不同的数据连接...”时,需要单击“是”
Eitanmg

5

您还可以查看基于CodeSmith 的PLINQO代码生成模板集,该模板使您可以为Linq-to-SQL和使用Linq-to-SQL做很多整洁的事情:

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

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

我知道的第二个工具是Huagati DBML / EDMX工具,该允许更新DBML(Linq-to-SQL)和EDMX(Entity Framework)映射文件,以及更多其他文件(如命名约定等)。

马克


刚删除CodeSmith / PLINQO之后,我强烈建议您不要采用这种方法。授予这个答案的年龄超过4岁……
Yuck 2013年

@Yuck:在这个时候,我强烈建议不要使用Linq-to-SQL-相反,使用Entity Framework,更好的选择!
marc_s 2013年

是的。在确认应用程序可以使用普通DBML而不是PLINQO正常运行之后,我转向EF,这是我清除旧应用程序的下一步。
Yuck

4

我们使用一个自定义的书面T4模板,该模板动态查询所有.DBML文件中每个表的information_schema模型,然后使用数据库中的新架构信息覆盖.DBML文件的某些部分。我高度建议实施这样的解决方案-它节省了我很多时间,并且与删除表并在模型中重新添加表不同,您可以保留关联。使用此解决方案,您将在架构更改时遇到编译时错误。不过,您要确保使用版本控制系统,因为差异确实很方便。如果您正在使用数据库模式优先方法进行开发,那么这是一个很好的解决方案,效果很好。当然,我不能共享我公司的代码,因此您自己编写自己的代码。但是,如果您了解一些Linq-to-XML并可以上这个项目上学,那么您可以到达想要的地方。


2

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


4
是的,但是VS2008中的可视设计器无法检测和响应您的基础数据库中的更改:-(缺少删除和重新添加,不支持更新模型:-(
marc_s

确实是这样,但这个问题非常模糊,没有特别提到在数据库更改时如何更新模型。
贾森·米森西奇克09年

2

先更新表再更新DBML会有细微差别。如果对现有表进行更改,则外键关系不会立即被立即移出。解决方法是构建项目,然后再次重新添加表。我向MS报告了此问题,并将其报告给VS2010。

DBML显示不显示新的外键约束


请注意,主要答案中给出的说明不清楚。更新表

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

我不相信它是固定的,因为相关的connect.microsoft.com/VisualStudio/feedback/details/414601/…不固定
Michael Freidgeim 2012年

在剪切和粘贴之前还是之后进行更改?
Kolob Canyon

已经有10年了...但是我相信这是在...之前进行更改,然后转到#2。
ΩmegaMan

1

如果是存储过程更新,则应将其从.dbml文件中删除,然后再次重新插入。但是,如果存储过程具有两个路径(例如:如果有的话;显示一些列;否则显示一些其他列),请确保两个路径具有相同的列别名!!!否则,将仅存在第一个路径列。


0

这是对我有用的完整分步方法,用于将LINQ更新为SQL dbml和相关文件,以包括一个添加到数据库表之一的新列。

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

1. Drag your updated table from Server Explorer onto the design surface

2. Copy the new column from this "new" table to the "old" table (see M463 answer for details on this step)

3. Delete the "new" table that you just dragged over

4. Click and highlight the stored procedure, then delete it

5. Drag the new stored procedure and drop into place.

6. Delete the .designer.vb file in the code-behind of the .dbml 
   (if you do not delete this, your code-behind containing the schema will
    not update even if you rebuild and the new table field will not be included)

7. Clean and Rebuild the solution (this will rebuild the .designer.vb file to include all the new changes!).
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.