2011-05-06 43 views
7

在编写在Fluent Nhibernate/Nhibernate上运行的应用程序时,有一点让我担心。我认为任何ORM都是如此(甚至不使用ORM),但是......我猜这个词是'研究领域',涉及部署后更新数据库的最佳实践和方法。部署后处理nHibernate/Fluent nHibernate中的架构更新

在nHibernate中,我建立了一个SessionFactory,并有一个初始运行,它根据映射写出数据库。这很好,我甚至可以手动编写数据库。但是当我的客户回来并想要添加新内容时呢?我可以附加到数据库而不会丢失数据吗?我对这一切都是全新的,自从这个项目开始以来一直困扰着我,而且我真的不知道要确定我可以在部署后管理该程序的方向。

我看过其他堆栈溢出问题,我可以找到关于这个主题 - 其中一个甚至没有接受的答案(虽然问题本身是一种模糊),但我确实发现了工具http://www.red-gate.com/products/sql-development/sql-compare/从问题 Tool to upgrade SQL Express database after deployment虽然我想知道是多么好的'战略'是。

回答

3

有几个选项,使用the AutoMapping feature in Fluent NHibernate减少您编写的映射代码。如果您的模式更改符合AutoMap约定,那么您只需处理相应的域对象更改。

另一个不太理想的选择是采取数据库优先的方法,并有like MyGeneration从模式自动生成域类和NHibernate映射文件。这工作,如果你有数据库架构的完全控制,它可以为实施良好的域模型设计(这很少发生过两个条件......)

在这两种方法中,these tools can help处理需要对数据库脚本将模式更改“迁移”到新版本

+0

好吧,我知道自动映射。我更关心的是如果模式发生变化,恐怕它可能会自动更改我的数据库并转储我的数据。 – Ciel 2011-05-10 13:48:47

+0

除非您在应用程序中编写代码来应用由NHibernate生成的模式脚本,否则这些脚本将不会自动应用。这些.NET [数据库迁移工具](http://stackoverflow.com/questions/313/net-migrations-engine)可以帮助更新具有模式更改的数据库,而不会丢失任何现有数据。 – 2011-05-10 13:56:11

0

根据我的经验,部署后必须手动保持数据库结构是最新的。
这意味着无论何时添加/更改您的数据库结构,您都可以使用带有DDL命令的脚本。当您准备部署时,您只需针对您的生产数据库运行这些DDL脚本。
例如,如果添加一个“酒吧”列到你的“富”表,你的脚本会是这样的(伪代码):

ALTER TABLE foo ADD COLUMN 'bar' int(32) not null default(0); 
+2

这个问题显然意味着自动解决方案 – Alexander 2012-11-14 13:32:30