使用NHibernate更新生产数据库的模式并添加默认数据

时间:2010-09-24 08:23:17

标签: asp.net nhibernate fluent-nhibernate

我正在寻找关于其他人如何管理以下情况的一些想法 - 我有一些想法,但它们看起来有点乱,我不禁想到我错过了什么。

情况如下:

  • 您正在使用NHibernate和Fluent NHibernate进行映射。
  • 您的生产中的应用程序包含带有实时数据的数据库
  • 您正在开发中添加新功能,它需要一个新的数据库列。

新列不能为空。例如,我最近不得不将DateCreated列添加到表中,应用程序现在使用该日期。由于现在唯一缺少数据,似乎没有必要添加代码来检查错误。

在我的应用程序中,我有一个更新程序可以执行SchemaUpdate来添加新的数据库列 - 但是,应用程序将开始崩溃,因为它期望新列中的值。

我需要在该列中获得一些合理的默认数据。在这种情况下,我手动运行更新以将日期设置为当前日期(足够好的情况)。在这种特殊情况下,我认为您不能使用流畅的映射将列默认设置为getdate()。

我的想法

  • 在配置文件中保留架构版本号
  • 在运行SchemaUpdate的更新程序中,开始为每个版本添加升级方法。这些方法将运行更新以添加默认数据(或其他必需操作)。
  • 运行架构更新后,调用大于当前版本的版本所需的所有方法(即之前未运行的版本)。因此,如果应用程序现在是版本4并且安装了版本2,则将运行方法3和4。
  • 更新已保存的版本号

其他人如何处理这种情况?

3 个答案:

答案 0 :(得分:1)

为了解决数据库版本问题,有很多不同的框架。 我正在使用MigratorDotNet。它是开源的,提供非常简单的API。 MigratorDotNet执行您想要的相同操作,但将数据库版本存储在将在第一次运行时创建的特殊表中。

此外,它还是作为控制台应用程序创建的,这就是您可以非常轻松地在CI服务器上使用它的原因。

答案 1 :(得分:0)

使用DBDeploy(http://dbdeploy.com/)

这种方式的工作原理是:

  • 创建一系列连续编号的alter脚本来创建架构
  • 告诉DBDeploy创建要应用的脚本。
  • DBDeploy将查看您的alter脚本和数据库以应用脚本并创建可以针对生产数据库运行的合并脚本。
  • DBDeploy维护生产数据库中已应用脚本的列表。

如果您需要对alter scripts

的一些解释,请查看http://goforthandcode.blogspot.com/2007/12/brief-history-of-database.html

披露:我为ThoughtWorks工作,我的一些同事创建了DBDeploy和DBDeploy.Net

答案 2 :(得分:0)

使用SchemaUpdate nHibernate 的一项功能。

对于参考数据,我使用标准格式化数据(例如CSV)中的简单输入代码。更新应用程序时,将从这些文件导入新数据。逻辑仅在数据已更改或更新时才更新数据。为此,我有一个额外的列是ModificationDate。

我将新的参考数据保存在带有另一个扩展名的压缩文件中以避免混淆(.dat)。

它工作得很好,我在小型桌面应用程序和大型企业项目中使用它。数据库的版本存储在数据库中名为DatabaseSetting的表中。