Fluent NHibernate - 只在不存在的情况下创建数据库架构
问题描述:
我有一个应用程序,我使用Fluent Nhibernate来创建我的数据库。到目前为止,我一直在重新创建数据库模式。代码是这样的:Fluent NHibernate - 只在不存在的情况下创建数据库架构
public NhibernateSessionFactory(IPersistenceConfigurer config)
{
_sessionFactory = Fluently.Configure().
Database(config).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
ExposeConfiguration(BuildSchema).
BuildSessionFactory();
}
private static void BuildSchema(Configuration config)
{
// if (DbExists(config))
// return;
new SchemaExport(config).Create(false, true);
}
请注意“if (DbExists(config))
”。这是我想要做的。我只想创建模式,只要它实际上不存在。在下一步中 - 如果它不是最新的,我想更新 。
我该如何做到这一点?我期待config.DatabaseExists()
,但我看不到这样的事情。我发现了一些解决方案的可能性,但处理这个问题的典型推荐方法是什么?
答
您可以只使用SchemaUpdate
相反,如果存在的话,它会更新架构,如果它不创建它:
public NhibernateSessionFactory(IPersistenceConfigurer config)
{
_sessionFactory = Fluently.Configure().
Database(config).
Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)).
BuildSessionFactory();
}
警告:SchemaUpdate
不做破坏性的更新(删除表格,列等)。它只会添加它们。
答
修订(感谢dotjoe)
就是hbm2ddl只能够做一个架构差异,只更新什么用SchemaUpdate工具类改变。然而这个类是非常基本的,因为它只考察当前的实体以及模式的不同。如果发生了重大变化(即删除了实体或删除了链接表),它将无法弄清楚。
在早期的项目中,我们使用了hbm2ddl,但是后来我们开始使用Fluent Migrator。我会说你最好的选择是使用迁移工具,如Fluent Migrator或Migrator.NET。
太棒了!这正是我所期待的。谢谢! – stiank81 2011-05-05 06:51:27
完美!谢谢 – Bronek 2014-06-12 18:54:44