【问题标题】:Is it possible to update old database from dbml file ? (C#, .Net 4, Linq, SQL Server)是否可以从 dbml 文件更新旧数据库? (C#、.Net 4、Linq、SQL Server)
【发布时间】:2010-05-05 13:36:28
【问题描述】:

我最近开始了一份新工作,一个非常有趣的项目(C#、.Net 4、Linq、VS 2010 和 SQL Server)。马上我就遇到了一个非常令人兴奋的挑战:我必须在程序启动时实现一个新工具或集成逻辑,或者其他什么,但必须发生的事情如下:客户有以前的应用程序和数据库(充满了他们的特定数据)。现在一个新版本已经准备好,客户得到了更新。与此同时,我们对 DB 进行了一些修改(新表、列,可能删除了旧列,或其他)。我是 Linq 和 SQL 数据库的新手,我的第一个解决方案可能是:我检查应用程序/数据库版本并逐步实施所有更改,比较所有表、列、键、约束等(所有这些新信息我有我的 dbml 和我从现有数据库中询问的旧版本)。每次版本更改时我都会这样做。但不知何故,我觉得这不是一个聪明的解决方案,所以我寻找这个问题的通用解决方案。

有没有办法从 dbml 文件更新客户数据库?创建一个新的不是问题(CreateDatabase with DataContext),有没有更新/改变数据库的方法?我想我不是唯一一个寻找这种解决方案的人(我在互联网上一无所获——或者我在寻找错误的关键字)。你是如何解决这个问题的?我也在寻找一个外部工具,但首先是使用 C#、Linq 或类似工具的解决方案。 如有任何想法,请提前感谢您!

最好的问候, 埃米尔

【问题讨论】:

    标签: c# .net sql linq


    【解决方案1】:

    我总是使用 Red Gate 的 SQL Compare 将新数据库的架构与旧数据库的架构进行比较。它将为您生成一个更改脚本,然后您可以在代码中运行该脚本。

    我们有一个表,其中有一行用于程序设置信息。此表中的一列是数据库版本号。当我们进行更新时,这将立即告诉我们客户拥有的数据库版本。然后我们运行每个脚本,将它们更新到它们需要运行的最新版本。每当我们发布一个新版本(带有数据库更改)时,我们都会运行 SQL 比较并制作一个脚本以从以前的版本转到下一个版本。我们不会执行任何会跳过版本的脚本,以防万一可能由此引发的奇怪冲突。

    这也使我们有机会通过编写自定义脚本并将其插入到更新脚本中来执行我们可能必须在版本之间执行的任何数据按摩。每个更新脚本也会更改该数据库版本字段。

    这使我们能够进行大量的自动更新。拥有该数据库版本允许客户端在用户有机会使用应用程序之前查看该版本。如果它不同并且应用程序需要更新,它将转到我们的 ftp 站点并下载更新并自动运行设置。

    【讨论】:

    • 这与我当时所做的大致相似 - 但我将更新脚本嵌入到代码中。我认为这主要是一个关于你自动化什么以及如何自动化的问题,而不是如果(-:
    【解决方案2】:

    基本上,您希望能够为更改编写脚本 - 能够运行“某些东西”,允许您将数据库的一个版本更新到下一个版本,并对所需数据进行任何必要的更改通过架构中的更改。

    好消息是您可以使用 SQL 来执行此操作,您可以编写 DDL 语句来创建和修改数据库架构。

    我的解决方案是将我的数据库架构维护完全放在代码中,我认为这是我迄今为止所做的最佳版本:

    How to create "embedded" SQL 2008 database file if it doesn't exist?

    为什么在代码中?因为它有效。可能不是最好的解决方案,但我已经取得了一些成功,结果是一致且可重复的。哦,它的版本也受控制。

    在这个特定实例中您可能遇到的大问题是您需要建立一个基线 - 以确保现有数据库在其架构方面是一致的。这就是更复杂和更聪明的工具可以更好地为您服务的地方 - 例如,能够进行模式差异然后更新作为一个概念具有很大的吸引力,但同样您在某种程度上依赖于您的参考数据库完美 这引发了其他问题。

    【讨论】:

    • 拥有一个完美的参考数据库作为基线总是让人头疼。我们只保留最后一个版本作为参考,并始终在版本之间制作脚本。这样,我们至少可以逐个版本更新,直到它们是最新的。但这可能不适用于所有情况。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多