C# 更新桌面应用程序的数据库(修补)

C# 更新桌面应用程序的数据库(修补),c#,.net,sql-server,entity-framework,C#,.net,Sql Server,Entity Framework,我想知道当你的程序被修补时,你用什么来更新客户端数据库 让我们来看看这个场景: 您有一个使用sql server compact数据库的桌面应用程序(.net,实体框架) 您发布了使用扩展数据库的应用程序的新版本 用户下载带有修改文件的修补程序 如何更新数据库 我想知道你是如何完成这个过程的。我有一些想法,但我认为经验更丰富的人可以给我更好、更久经考验的解决方案或建议。您需要在代码数据库升级机制中显式或隐藏提供,从而实现类似于数据库版本控制链的功能。您需要在代码数据库升级机制中显式或隐藏提供,因

我想知道当你的程序被修补时,你用什么来更新客户端数据库

让我们来看看这个场景:

  • 您有一个使用sql server compact数据库的桌面应用程序(.net,实体框架)
  • 您发布了使用扩展数据库的应用程序的新版本
  • 用户下载带有修改文件的修补程序
  • 如何更新数据库

  • 我想知道你是如何完成这个过程的。我有一些想法,但我认为经验更丰富的人可以给我更好、更久经考验的解决方案或建议。

    您需要在代码数据库升级机制中显式或隐藏提供,从而实现类似于数据库版本控制链的功能。

    您需要在代码数据库升级机制中显式或隐藏提供,因此,实现类似DB版本控制链的功能有两个方面。 首先是版本控制。您需要某种方法将teeh db的版本与程序的版本联系起来,可以是像表中有版本号这样简单的东西。您还需要在执行应用程序时检查它

    一个有趣的场景是,您成功地“更新”了应用程序和数据库,然后由于某些操作原因,客户恢复了数据库的早期版本,或者如果您处于频繁的补丁周期中,您是否必须按顺序进行每个补丁,或者是否可以赶上。您希望以不同的方式处理仅应用程序升级还是仅数据库升级

    没有一种正确的方法可以做到这一点,你必须看看你做出了什么样的改变,你准备保持什么样的复杂性,以应对可能出现的一切问题

    有几件事值得一看。 两个数据库,一个用于静态“只读”数据,另一个用于更多动态数据。然后,升级静态数据可以简单地从升级包中的资源进行恢复

    另一个问题是如何处理存储在db表中的元数据。例如,使用基于版本的xsd来描述对象,而不是具体的类。这在您的只读数据库中,现在您已经用恢复和可能的一些转换更新了代码和应用程序

    还有很多路要走,记住 “用户”总是会通过做一些你从未想过他们会做的事情来让你看起来像个eejit

    系统越复杂,发生上述情况的可能性就越大


    最后但并非最不重要的一点是,不要在数据版本转换上走捷径,如果您失去了数据完整性,您所做的一切都将被浪费。

    这有几个方面。 首先是版本控制。您需要某种方法将teeh db的版本与程序的版本联系起来,可以是像表中有版本号这样简单的东西。您还需要在执行应用程序时检查它

    一个有趣的场景是,您成功地“更新”了应用程序和数据库,然后由于某些操作原因,客户恢复了数据库的早期版本,或者如果您处于频繁的补丁周期中,您是否必须按顺序进行每个补丁,或者是否可以赶上。您希望以不同的方式处理仅应用程序升级还是仅数据库升级

    没有一种正确的方法可以做到这一点,你必须看看你做出了什么样的改变,你准备保持什么样的复杂性,以应对可能出现的一切问题

    有几件事值得一看。 两个数据库,一个用于静态“只读”数据,另一个用于更多动态数据。然后,升级静态数据可以简单地从升级包中的资源进行恢复

    另一个问题是如何处理存储在db表中的元数据。例如,使用基于版本的xsd来描述对象,而不是具体的类。这在您的只读数据库中,现在您已经用恢复和可能的一些转换更新了代码和应用程序

    还有很多路要走,记住 “用户”总是会通过做一些你从未想过他们会做的事情来让你看起来像个eejit

    系统越复杂,发生上述情况的可能性就越大


    最后但并非最不重要的一点是,不要在数据版本转换上走捷径,如果您失去了数据完整性,您所做的一切都将被浪费。

    您需要一个迁移框架

    有像FluentMigrator这样的现有OSS库

    Entity Framework Code First也将获得自己的迁移框架,但仍处于测试阶段:


    您需要一个迁移框架

    有像FluentMigrator这样的现有OSS库

    Entity Framework Code First也将获得自己的迁移框架,但仍处于测试阶段: