我喜欢Fluent NHibernate来构建我的数据库,到目前为止还没有找到限制让我陷入困境。
然而,在我目前的项目中,我希望在产品生命周期的早期阶段发布到生产环境,因此我们期望随着我们的进展,db模式会发生许多小的变化。
我想使用像migratordotnet这样的工具跟踪“迁移”中的这些DDL和DML更改。但我的问题是:是否有可能让这两个工具(或类似工具)一起工作?
本着DRY的精神,如何从Fluent Nhibernate中的映射中获取架构更改?这可能吗?
或者更好的方法是将模式生成留给像migratordotnet这样的工具,让Fluent NHibernate只具有映射的可响应性?嗯,这看起来似乎更好地分离了工具级别的问题。
干杯!
答案 0 :(得分:7)
戈登,
我在以前的项目中遇到了同样的问题,我们已经决定只使用migratordotnet进行数据库迁移,而只是完全跳过SchemaUpdate。
我仍然会使用SchemaUpdate来快速制作原型,但是一旦我认真启动项目,我只使用migratordotnet。
迁移设置作为我们夜间构建的一部分运行,一旦我们有多个人在项目上工作,migratordotnet就能很好地工作。
答案 1 :(得分:2)
我也遇到了同样的问题,我不想独立维护迁移(使用migratordotnet)和我的映射文件。到目前为止我唯一有用的东西是NHibernate的SchemaUpdate,但它不能处理删除列或表。对于这些类型的更改,您仍然需要手动编写迁移。现在我倾向于专门使用migratordotnet进行数据库更改,而不是混合使用SchemaUpdate生成DDL和迁移。但这似乎仍然容易出错,因为您可能会错误地将映射/域层更改转换为迁移。
答案 2 :(得分:1)
我面临同样的问题。这是我当前的工作流程,它避免了SchemaUpdate:
此工作流程适用于开发,因为每次都可以从头开始重建和填充数据库,从而解决数据库版本控制问题。它还为测试数据库和您插入的实际数据提供了良好的基础。
显然,一旦实时数据库正在运行,这种情况无法在生产中发挥作用,不能随意删除和重建。这就是我正在做的事情:
这并不理想,并且使用了商业SQL Compare产品。它一直在为我工作,但我想听听一些更好的想法。
答案 3 :(得分:0)
是的 - 主要是。我成功地使用FNH和migratordotnet用于厚桌面客户端,它运行良好。我必须修改两件事:
允许将sql连接注入TransformationProvider(或更准确地说,SQLiteTransformationProvider)
删除对其他非sqlite TransformationProviders的引用,因为当我尝试使用我的应用程序打包它时,它会抛出无法找到Oracle,Postgres等的各种错误。
这是sqlite特有的 - 破解它以便更好地解析sqlite create table语句。不幸的是,它无法处理CREATE TABLE FOO(id INT, ..., primary key(id))
形式的创建表语句(而不是它处理的CREATE TABLE FOO(id INT PRIMARY KEY, ...)
)。将其与执行列删除的方式(创建新表sans列,传输数据,删除原始文件并将新文件重命名为原始文件)相结合,这意味着您可以获得非常令人讨厌的行为,例如在表格中删除列,使主键列为a非主键列。