流利的NHibernate和migratordotnet能很好地融合在一起吗?

时间:2009-06-02 19:43:12

标签: .net fluent-nhibernate migration migratordotnet

我喜欢Fluent NHibernate来构建我的数据库,到目前为止还没有找到限制让我陷入困境。

然而,在我目前的项目中,我希望在产品生命周期的早期阶段发布到生产环境,因此我们期望随着我们的进展,db模式会发生许多小的变化。

我想使用像migratordotnet这样的工具跟踪“迁移”中的这些DDL和DML更改。但我的问题是:是否有可能让这两个工具(或类似工具)一起工作?

本着DRY的精神,如何从Fluent Nhibernate中的映射中获取架构更改?这可能吗?

或者更好的方法是将模式生成留给像migratordotnet这样的工具,让Fluent NHibernate只具有映射的可响应性?嗯,这看起来似乎更好地分离了工具级别的问题。

干杯!

4 个答案:

答案 0 :(得分:7)

戈登,

我在以前的项目中遇到了同样的问题,我们已经决定只使用migratordotnet进行数据库迁移,而只是完全跳过SchemaUpdate。

我仍然会使用SchemaUpdate来快速制作原型,但是一旦我认真启动项目,我只使用migratordotnet。

迁移设置作为我们夜间构建的一部分运行,一旦我们有多个人在项目上工作,migratordotnet就能很好地工作。

答案 1 :(得分:2)

我也遇到了同样的问题,我不想独立维护迁移(使用migratordotnet)和我的映射文件。到目前为止我唯一有用的东西是NHibernate的SchemaUpdate,但它不能处理删除列或表。对于这些类型的更改,您仍然需要手动编写迁移。现在我倾向于专门使用migratordotnet进行数据库更改,而不是混合使用SchemaUpdate生成DDL和迁移。但这似乎仍然容易出错,因为您可能会错误地将映射/域层更改转换为迁移。

答案 2 :(得分:1)

我面临同样的问题。这是我当前的工作流程,它避免了SchemaUpdate:

  • 从头开始构建数据库(如果有任何更改)
  • 将所有参考数据保存在电子表格中
  • 通过特殊命令行'dataloader'项目重新加载所有数据

此工作流程适用于开发,因为每次都可以从头开始重建和填充数据库,从而解决数据库版本控制问题。它还为测试数据库和您插入的实际数据提供了良好的基础。

显然,一旦实时数据库正在运行,这种情况无法在生产中发挥作用,不能随意删除和重建。这就是我正在做的事情:

  • 完成开发周期后,我将生成数据库的克隆。 Prod数据库只读升级时间(我的应用程序确定...不确定更多时间关键应用程序)
  • 使用SQL Compare将更改和数据从dev迁移到prod数据库
  • 推动测试。
  • 如果测试通过,请继续生产。

这并不理想,并且使用了商业SQL Compare产品。它一直在为我工作,但我想听听一些更好的想法。

答案 3 :(得分:0)

是的 - 主要是。我成功地使用FNH和migratordotnet用于厚桌面客户端,它运行良好。我必须修改两件事:

  1. 允许将sql连接注入TransformationProvider(或更准确地说,SQLiteTransformationProvider)

  2. 删除对其他非sqlite TransformationProviders的引用,因为当我尝试使用我的应用程序打包它时,它会抛出无法找到Oracle,Postgres等的各种错误。

  3. 这是sqlite特有的 - 破解它以便更好地解析sqlite create table语句。不幸的是,它无法处理CREATE TABLE FOO(id INT, ..., primary key(id))形式的创建表语句(而不是它处理的CREATE TABLE FOO(id INT PRIMARY KEY, ...))。将其与执行列删除的方式(创建新表sans列,传输数据,删除原始文件并将新文件重命名为原始文件)相结合,这意味着您可以获得非常令人讨厌的行为,例如在表格中删除列,使主键列为a非主键列。