【问题标题】:Problem refreshing tables in the LINQ to SQL designer在 LINQ to SQL 设计器中刷新表时出现问题
【发布时间】:2008-12-05 21:32:55
【问题描述】:

我使用 LINQ to SQL 已经有一段时间了,有一件事情一直困扰着我。每当我修改表的架构时,为了在设计器中刷新它,我必须将其删除然后重新添加。这很好,但这意味着我必须在设计器中真正找到表。我的数据库中有大约 100 多个表,每次我这样做时,就像大海捞针一样。好吧,也许它没有那么糟糕,但说真的,它需要的时间比它应该的要长。

还有其他我不知道的刷新表格的选项吗?

【问题讨论】:

    标签: visual-studio visual-studio-2008 linq linq-to-sql


    【解决方案1】:

    有些人使用SqlMetal 来“刷新/更新”他们的 Linq2Sql 设计器。当数据库更改时,设计器不支持刷新模式。您必须手动删除表格并重新添加。

    ADO Entity Framework我相信可以刷新。我没有使用过它,但我想我在今年的 TechEd 演示中看到了它。

    有用信息:Google's results 用于 SqlMetal。

    【讨论】:

    • SqlMetal 就是答案。您只需使用一些参数调用它并告诉它在哪里输出代码文件,然后您就设置好了。我不确定它对设计器进行了哪些优化,但它方式更快,并且不需要不必要的拖放。甜的! (谢谢)
    • EF 不会真正刷新 - 它会替换整个 SSDL,因此您可能会丢失对 SSDL 所做的任何自定义。
    【解决方案2】:

    使用 VS linq to sql 设计器无法做到这一点。

    您可以使用第三方工具 LLBLGEN PRO 来完成此操作,而不是使用内置的 linq to sql 设计器。它不是免费的,但它也可以做很多其他的事情,当然你可能需要也可能不需要。

    LLBLGEN PRO 实际上是一整套 ORM 工具,但还包括一个增强的 linq-to-sql 设计器,具有“从 SQL 刷新模型”功能。

    有关问题的描述,请参见此处 - http://weblogs.asp.net/fbouma/archive/2008/05/01/linq-to-sql-support-added-to-llblgen-pro.aspx 这里是工具 - http://www.llblgen.com/

    【讨论】:

      【解决方案3】:

      我没有对设计器上的内容进行任何自定义,所以在表格更改后,我只需按 CTRL+A,然后按 DEL。然后移位选择我所有的桌子并将它们拍回设计师身上。我还没有 100 张桌子,所以不确定事情是否会在某个时候变慢,但是有 20 多张桌子只需要一秒钟。

      【讨论】:

      • 这绝对是我发现自己也在做的事情,但是有 100 张桌子,这比我想要的要慢一点。
      • 这样你也会失去任何关系。
      【解决方案4】:

      我已经编写了一个可以做到这一点的插件(双向;数据库 -> DBML DBML- -> SQL-DDL diff 脚本)。

      与另一个回复中提到的 SQLMetal(或 EF 的“从数据库更新模型”)不同,加载项执行真正的同步/刷新;应用仅对应于模型和底层数据库之间差异的更改。

      这意味着您在模型的其他区域所做的任何自定义(重命名的属性/导航属性等)都不会被删除/覆盖,除非它们与底层数据库架构冲突。 (在这种情况下,您仍然可以通过将它们添加到加载项的“排除列表”来保留它们)

      您可以从http://www.huagati.com/dbmltools/ 下载并获得 30 天免费试用许可证

      【讨论】:

        【解决方案5】:

        我有类似的评论,认为它可能适合任何人在谷歌上搜索此问题的解决方案...

        当我更改存储过程返回的列时,从设计器中删除该过程并重新添加它不起作用。设计器生成的自定义返回类型实体不反映对 SP 的更改。

        我已经尝试在服务器资源管理器中断开数据库,甚至删除并重新添加连接。

        我找到的唯一解决方案是: 1.从设计器中删除SP。 2. 保存 dbml 文件(或整个解决方案,无论如何) 3. 完全关闭 Visual Studio。 4. 重新打开 Visual Studio 和您的解决方案。 5. 将存储过程重新添加到设计器中。

        我认为这相当于臀部的蓝丝带疼痛。 有人有更简单的解决方案吗?

        PS- 对于那些拥有 100 多个表的人:去获取一个真正的(真正的 == 成熟的)ORM 工具。我个人投票给 NetTiers。它摇摆不定。多年来一直使用它,没有(或至少很少)抱怨。您可能必须购买 CodeSmith 才能有效地使用它,但这是值得的。模板是开源的。 nHibernate 也有模板。但我发现我并没有真正挖掘 Java 端口。如果我要在 MS 平台上编写代码,我想要那些“诞生”在那里的代码......

        ...编辑完成。 :P

        【讨论】:

          【解决方案6】:

          我与设计师有类似的问题 - 我可以建议的最好的事情是为您的数据访问的不同区域创建多个上下文 - 我将我的每个功能区域分解为尽可能少的相关表.您可以跨上下文重复使用表格,所以这没什么大不了的。

          【讨论】:

          • 这是有道理的,但就我的情况而言,我认为不必记住要为哪个表使用哪个上下文是不值得的。
          • 另外,如果你在不同的上下文中使用同一个表,如果你更新那个表,你需要记住更新它使用的所有上下文。
          【解决方案7】:

          有一个替换设计器的 VS 2008 模板,它应该可以轻松刷新您的 LINQtoSQL 类:http://damieng.com/blog/2008/09/14/linq-to-sql-template-for-visual-studio-2008

          【讨论】:

          • 此模板将 DBML 替换为代码阶段,而不是将数据库替换为 DBML 阶段,这是用户遇到问题的地方。
          【解决方案8】:

          还有其他几个选项:

          1. 编辑设计人员用来绘制表格和生成代码的 .dbml 文件。当更改很小(添加几列,创建一个简单的表)时,我使用了这种方法
          2. 使用 sqlmetal 为更改的表创建所需的 xml,并手动将声明移动到 .dbml 文件。当更改更复杂或更大时,这个更适合。

          【讨论】:

            【解决方案9】:

            我个人讨厌使用该设计器,并且每当我敢于使用它时都会遇到各种问题。

            我主要将 LINQ 用于非常简单的 CRUD(没有链接实体或任何东西),如果您是这种情况,那么可能值得远离设计师的拐杖。尤其是因为定义 LINQ-to-SQL 实体就这么简单:

            [Table("dbo.my_table")]
            public class MyTable
            {
            [Column("id", AutoSync = AutoSync.OnInsert, IsDbGenerated = true, IsPrimaryKey = true)]
            public Int32 Id { get; set; }
            
            [Column("name", DbType="NVarChar(50) NOT NULL")]
            public String Name { get; set; }
            }
            

            这样,您的所有实体都有自己的文件,这使得查找它们变得更加容易,但您仍然需要手动添加/更新属性。

            当然,如果您要重构 100 多个表,那可能不是一个选择;)

            【讨论】:

            • 感谢您的建议,但我真的不想陷入手动编码所有这些的情况。我喜欢代码生成,只是不喜欢糟糕的刷新支持。
            猜你喜欢
            • 2010-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-22
            • 2020-11-24
            • 1970-01-01
            相关资源
            最近更新 更多