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

发布于 2024-09-25 02:11:36 字数 752 浏览 3 评论 0原文

我正在寻找一些关于其他人如何处理以下情况的想法 - 我有一些想法,但它们看起来有点混乱,我不禁认为我错过了一些东西。

情况如下:

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

新列不能为空。例如,我最近必须将 DateCreated 列添加到表中,并且应用程序现在使用该日期。由于数据唯一会丢失的时间是现在,因此似乎没有必要添加代码来检查错误。

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

我需要在该列中获取一些合理的默认数据。在这种情况下,我手动运行更新以将日期设置为当前日期(对于这种情况来说已经足够了)。在这种特殊情况下,我相信您无法使用流畅的映射将列默认设置为 getdate() 。

我的想法

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

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

I'm looking for some ideas on how other people are managing the following situation - I've got some ideas but they seem a little messy and I can't help thinking I'm missing something.

Here's the situation:

  • You're using NHibernate with Fluent NHibernate for mappings.
  • You have an application in production with a database with live data
  • You're adding a new feature in development and it requires a new database column.

The new column cannot be blank. For example, I recently had to a DateCreated column to a table and the app now uses that date. As the only time the data will be missing is now, it seems unnecessary to add code to check for errors.

In my application I have an updater which can execute a SchemaUpdate to add the new database column - however, the application will starting crashing as it is expecting a value in the new column.

I need to get some sensible default data into that column. In this case I manually ran an Update to set the date to the current date (good enough for the situation). In this particular case I believe that you cannot set the column default to getdate() using fluent mappings.

My Idea

  • Keep a schema version number in a config file
  • In the updater that runs SchemaUpdate start adding upgrade methods for each version. These methods would run updates to add default data (or other required actions).
  • After the schema update has been run, call all methods required for a version greater than the current version (i.e. those that haven't previously been run). So if the app is now version 4 and version 2 is installed, methods 3 and 4 would be run.
  • Update the saved version number

How are other people handling this situation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

老子叫无熙 2024-10-02 02:11:50

使用 SchemaUpdatenHibernate 的一项功能。

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

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

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

Use SchemaUpdate, a feature of nHibernate.

For reference data, I use simple importation code from standard formatted data (such as CSV). When the application is updated, new data is imported from those files. The logic update the data only if it has changed or is new. For that I have an extra column which is ModificationDate.

I keep new reference data in a zipped file with another extension to avoid confusion (.dat).

It works very well, and I used it in small desktop application and large enterprise projects. Version of the database is stored within the database in a table called DatabaseSetting.

对不⑦ 2024-10-02 02:11:47

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

其工作方式是:

  • 创建一堆按顺序编号的更改脚本创建您的模式
  • 告诉 DBDeploy 创建要应用的脚本。
  • DBDeploy 将查看您的更改脚本和数据库以应用脚本并创建可针对生产数据库运行的整合脚本。
  • DBDeploy 在生产数据库中维护一个已应用脚本的列表。

另请查看 http://goforthandcode.blogspot.com/ 2007/12/brief-history-of-database.html 如果您需要更改脚本的一些解释

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

Use DBDeploy (http://dbdeploy.com/)

The way this works is:

  • Create a bunch of serially numbered alter scripts to create your schema
  • Tell DBDeploy to create the script to apply.
  • DBDeploy will look at your alter scripts and the db to apply the scripts to and create a consolidated script which can be run against the production DB.
  • DBDeploy maintains a list of applied scripts in the production DB.

Also take a look at http://goforthandcode.blogspot.com/2007/12/brief-history-of-database.html if you need a bit of an explanation of alter scripts

Disclosure: I work for ThoughtWorks and some of my colleagues created DBDeploy and DBDeploy.Net

寻找一个思念的角度 2024-10-02 02:11:44

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

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

For solving data base versioning problems there are a lot of different frameworks.
I'm using MigratorDotNet. It is open source and provides really simple API.
MigratorDotNet does the same thing that you want to, but stores data base version in special table that will be created on the first run.

Also it is created as a console application and that is why you can use it on your CI server very easily.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文