1

我已经阅读了很多关于如何为开发人员升级数据库等的问题,并且我倾向于使用migratordotnet或类似的东西,但似乎升级需要使用 MSBuild 或 NAnt 之类的东西来运行。这些不是我期望最终用户安装的东西。

理想情况下,这个过程应该是用户安装新版本的应用程序,启动它,它会处理幕后的一切。根据这个过程需要多长时间,我可能会或可能不会显示进度条,然后它就完成了,使用该应用程序通常会幸福地不知道有诸如 sql、msbuild、关系数据库之类的东西,甚至是任何远程技术探测的东西。

其他杂项信息:

安装了 xcopy 的 SQLCE。

很可能不应该太大的单用户数据库。

随着程序通过用户对请求功能的输入而不断发展,发布将相当频繁。

初始版本尚未完成,因此无需担心任何当前数据,只需要初始和后续版本的无痛过程(对于最终用户,最好对我来说也是如此!)。

使用 LINQ to SQL 作为 ORM。(我是否先升级数据库然后
运行 ​​SQLMetal 来重新生成
类?)

做 TDD(第一次)并想知道如何自动化测试升级。

Visual C# Express 所以没有 VS 插件。

编辑:

我猜 MSBuild 附带 .NET Framework 而不仅仅是 VS,所以我想这不是问题,我可以使用 migratordotnet 并直接使用 msbuild。如果需要,我可能会重定向控制台输出并进行一些简单的字符串解析以获取进度信息,但如果它看起来需要足够长的时间来保证显示实际进度而不仅仅是一个选框进度条,我会诉诸于此。

4

4 回答 4

2

这是一个选项:

  1. 将数据库版本存储在数据库中的某处
  2. 在启动时,通过将代码中的常量与数据库版本进行比较,确保数据库是最新的。
  3. 如果不是当前运行一组脚本来创建/更改表、转换数据等。

如果您已经部署并且没有数据库版本,那么只需检查架构以了解您在最新数据库版本中所期望的内容。

去测试:

  1. 从旧数据库开始
  2. 创建一个 UpdateDatbaseIfNeeded() 的方法
  3. 如果模式得到更新并且数据库版本得到设置,测试应该通过

您还可以预加载您的测试数据库,以测试需要由升级脚本处理的各种转换问题。

于 2009-05-01T17:09:16.970 回答
1

The only thing I would add to the above comments is that you also need to be worried about a pack type operation.

To upgrade your apps from SQL CE 3.1 to 3.5 required you install the 3.5 libraries, and then issue a pack operation to upgrade the database format. You may want to keep this in mind as a part of your process. For SQL CE 3.5 just opening the database in 3.5 will make it no longer compatible with 3.1 - meaning if your user then later restored a backup of the application or something you can't load it. So you need to trap those errors at connection time and make sure you handle all the exceptions from MS for version incompatibility.

Another gotcha with 3.1 and 3.5 is that you can't have them both loaded to Visual Studio at the same time. So testing this process over and over means a VM that you can wipe and upgrade repeatedly. You can't really do it on your development machine. :(

于 2009-05-16T05:51:13.967 回答
0

以下是您可以使用Wizardby执行的操作。

它有一个 API,允许您以编程方式执行数据库模式迁移任务。您将需要一个适当的IDbPlatformSqlCePlatform也存在) a IMigrationVersionInfoManager,它有一个标准实现,将版本信息存储在SchemaInfo表中,aIMigrationScriptExecutive也有默认实现,以及IMigrationService它本身。接下来,您编写一个迁移定义,将其编译到您的程序集中并将其提供给IMigrationService.Migrate(connectionString, null, yourMigrationDefinition).

于 2009-05-14T06:10:36.137 回答
0

一般来说,这个东西通常的做法是在安装时完成数据库迁移;在安装期间,您有一大堆代码(通常是完全自定义的),它们检测数据库的现有版本,并执行将数据从现有数据库迁移到新数据库所涉及的所有操作(即创建临时表、复制数据)从现有表到临时表、删除现有表、创建新表、执行连接以将临时表中的数据添加到新表等)。根据定义,这个过程非常复杂。我不知道有任何工具可以专门针对最终用户生产环境自动执行转换过程。(在处理最终用户数据库时通常会涉及很多特殊情况。)

于 2009-05-01T16:59:58.553 回答