我有一个应用程序,我使用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()
,但我看不到这样的事情。我看到了hacky解决方案的一些可能性,但是处理这个问题的典型推荐方法是什么?
答案 0 :(得分:70)
您只需使用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
不会进行破坏性更新(删除表,列等)。它只会添加它们。
答案 1 :(得分:10)
更新(感谢dotjoe)
Hbm2ddl只能执行模式差异,只能更新SchemaUpdate类更改的内容。然而,这个类非常简陋,因为它只需要查看当前实体以及模式的不同之处。如果已经进行了重大更改(即删除了实体或删除了链接表),它将无法解决这个问题。
在早期的项目中,我们使用了hbm2ddl,但是我们已经开始使用Fluent Migrator了。我想说最好的办法是使用迁移工具,如Fluent Migrator或Migrator.NET。