我正在考虑使用 FluentNHibernate 作为我的 ORM,但我想知道如何最好地编写数据库部署部分。我之前有过实体框架和代码优先迁移的经验,但我对 FluentNHibernate 很好奇,所以我在玩。我看过FunnelWeb 博客,但我还没有时间真正了解他们是如何做的,所以我在项目的一个非常具体的部分寻求一些帮助,我希望有人可以总结一下。
我的 Visual Studio 解决方案在以下程序集中分开(我将研究使用像Autofac这样的 IoC ,但稍后会出现):
Solution
Domain Assembly
DatabaseDeployment Namespace
Model Namespace
Web UI
因此,在我的域程序集中,我希望有一个 DBMigrator 类,它的合同看起来像这样:
public interface IDBMigrator
{
bool NeedsUpdating();
void UpdateDatabase();
}
现在,在我的 WebUI 程序集(这是一个 MVC3 项目)中,我想做类似以下的事情(在 global.asax 中):
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var migrator = new DBMigrator();
if (migrator.NeedsUpdating())
{
migrator.UpdateDatabase();
}
}
此迁移器将使用 .sql 脚本(因此我可以让我的数据库版本由 Subversion 控制)并且可能在数据库中有一个表,告诉我哪些脚本已针对架构执行,哪些脚本尚未执行。所以,总而言之,我想我的实际问题是:
- 我是否在版本控制(和自动化)我的数据库部署的正确轨道上?
- 我应该在什么时候检查(并应用)我的项目的架构更改,这真的应该是自动化的还是开发人员发起的?
我现在正在研究一些框架,例如DbUp和MigratorDotNet,但在我为此采用框架之前,我想先把我的策略牢记在心。您如何处理数据库迁移?