使用ORM(特别是NHibernate)时,如何处理数据的重构?我的意思是,如果数据对象发生更改以使底层关系数据库架构发生更改,ORM是否在数据库中提供架构升级/降级方面的任何帮助?如何将现有数据迁移到新架构?
我正在决定使用ORM并且曝光率非常有限。如果问题很幼稚,请耐心等待。
答案 0 :(得分:16)
在NHibernate中,您可以使用SchemaUpdate类对架构进行附加更改。 (添加剂更改将包括新表,新列等,但不包括删除。)SchemaUpdate旨在用于开发目的,不应在生产中运行。我强烈建议您查看一个SQL迁移工具,例如Tarantino,dbdeploy.net,RikMigrations或类似工具。
迁移工具有两种形式 - 基于SQL脚本(Tarantino和dbdeploy.net)和基于代码(RikMigrations和Rails风格的迁移)。使用基于代码的迁移工具,您可以使用C#,VB,Ruby编写的代码编写迁移...基于SQL脚本的SQL工具采用一组有序的SQL脚本。在任何一种情况下,迁移工具都会针对您之前未运行的数据库运行任何迁移。 (通常,迁移表列出已运行的脚本,并允许工具确定哪些仍需要运行。)SQL脚本通过以下方式生成:
// SchemaUpdate.Execute(bool script, bool doUpdate)
new SchemaUpdate(cfg).Execute(true, false);
然后编辑品尝。或者您可以使用NHibernate的SchemaExport生成一个新模式,并使用模式差异工具,例如Microsoft Visual Studio for Database Professionals Ultimate Now With Extra Mayo Edition(又名DataDude)或RedGate SQL Compare。您需要手动编写转换脚本,因为SQL迁移工具通常无法知道填充了T / F的Foo char(1)列应该转换为该Bar位列。
我个人更喜欢基于SQL脚本的迁移工具,因为我可以使用工具生成模式差异,然后进行编辑,而不必使用C#或类似语言手动滚动整个迁移。