NHibernate和数据库更改/部署

时间:2010-01-09 00:20:14

标签: sql nhibernate deployment fluent-nhibernate

我正在考虑将NHibernate和Fluent NHibernate用于我的下一个项目,但有一件事我想事先清理一下,你是如何管理对数据库的更改的呢?

例如,我有NH + FNH正在工作,应用程序已经部署并且正在运行但是我们在开发环境中进行了更改,例如我们向使用NH / FNH映射的实体添加新属性。

如何在不丢弃表格的情况下将该更改应用于数据库?

谢谢 GE

6 个答案:

答案 0 :(得分:9)

我有很好的使用这个框架的经验:

http://code.google.com/p/migratordotnet/

基本上,您为每个数据库更改创建一个类,并使用时间戳注释该类。然后以时间戳顺序应用最终的程序集。

这意味着在开发过程中,每次结账后都可以轻松地运行数据库升级过程,并且知道您与世界同步。

using Migrator.Framework;
using System.Data;

namespace DBMigration
{
    [Migration(20080401110402)]
    public class CreateUserTable_001 : Migration
    {
            public void Up()
            {
                    Database.CreateTable("User",
                            new Column("UserId", DbType.Int32,
                            ColumnProperties.PrimaryKeyWithIdentity),
                            new Column("Username", DbType.AnsiString, 25)
                            );
            }

            public void Down()
            {
                    Database.RemoveTable("User");
            }
    }

答案 1 :(得分:4)

AFAIK,你需要手动完成。您可以在每次初始化时导出架构,但不能自动更改表。因为模式只包含create语句。

也许,您可以使用Red Gate之类的工具来查找数据库差异,并自动为您创建语句。这个想法是,

- 在测试数据库上生成模式
- 运行Red Gate工具,在模式级别找到DIFF - 自动创建diff脚本
- 在主数据库上应用差异

答案 2 :(得分:4)

NHibernate支持SchemaUpdate类,它可以进行某些模式修改,但不是全部。这里有更多细节:

How to update database table schemas with NHibernate schema generation?

答案 3 :(得分:2)

无论您使用的是什么ORM工具,如果进行架构更改,您将不得不同时部署代码和架构更改。对于我们的项目,这意味着对于包含架构更改的每个版本,我们编写一个用于更新数据库的sql脚本。该脚本由我们的安装程序运行,同时包含新hibernate映射的代码部署到服务器,并且在架构修改完成之前不会启动新应用程序。

使用该技术,我们能够更改表,删除表,添加表以及将数据从一个表迁移到另一个表而不会出现任何重大问题。让脚本执行数据库修改允许您在部署到生产环境之前对其进行彻底测试。

答案 4 :(得分:1)

这是我制定的过程。我觉得它相当光滑。

这个过程是这样的,假设你有一个名为'MyDb'的数据库

  1. 在模型和NH映射中进行更改
  2. 运行脚本以删除然后重新创建名为MyDb_Next的数据库,并执行NH SchemaExport以将新架构写入其中
  3. 使用我的工具MigrationScriptGenerator来比较MyDb和MyDb_next。这将通过比较模式和创建语句以添加新列等来生成更改脚本(或尽可能多的脚本)。脚本将保存到VS项目中的xxxx - updatescript.sql.suggested文件中
  4. 如有必要,修复建议的sql脚本(检测到可能丢失数据的更改时需要人工输入),并重命名为.sql(以便下一步可以选择)
  5. 包含sql脚本的项目上的post build事件运行我的工具simplescriptrunner这将sql脚本应用于MyDb,使其保持最新
  6. 只要您更改实体,就可以重复此过程。我通常将我的SQL脚本存储在.csproj中,并有一个运行simplescriptrunner的post build事件。这样,执行更新和重建的任何其他开发人员都将使用已签入的编号脚本在其计算机上生成最新版本的数据库。

    MigrationScriptGenerator使用OpenDBDiff(类似于Red Gate SQL Compare的开源工具)来生成脚本。如果您想自己创建脚本,可能会觉得很有用。

    PS这些工具仅适用于SQL Server - 抱歉!

答案 5 :(得分:1)

我知道这是一个老问题,但我在谷歌中看到它作为最佳结果,它没有提到似乎是NHibernate迁移标准的工具 - Fluent Migrator