Fluent NHibernate - 仅在不存在时创建数据库模式
Posted
技术标签:
【中文标题】Fluent NHibernate - 仅在不存在时创建数据库模式【英文标题】:Fluent NHibernate - Create database schema only if not existing 【发布时间】:2011-08-18 13:37:19 【问题描述】:我有一个使用 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 解决方案的可能性,但是典型的推荐处理方法是什么?
【问题讨论】:
【参考方案1】:已更新(感谢 dotjoe)
Hbm2ddl 只能进行模式差异,并且只能更新使用 SchemaUpdate 类更改的内容。然而,这个类非常初级,因为它只查看当前实体以及模式的不同之处。如果进行了重大更改(即删除了实体或删除了链接表),它将无法弄清楚。
在早期的项目中,我们使用了 hbm2ddl,但后来我们开始使用 Fluent Migrator。我想说你最好的选择是使用迁移工具,比如 Fluent Migrator 或 Migrator.NET。
http://github.com/schambers/fluentmigrator/
http://code.google.com/p/migratordotnet/
【讨论】:
实际上 Hbm2ddl 可以使用SchemaUpdate
生成更改脚本...但是,它并不能捕获所有内容,我永远不会依赖它。
@dotjoe 你是指它不进行破坏性更新的事实吗?我在生产中使用 SchemaUpdate,从来没有遇到过它没有捕捉到东西的问题。
@Gabe Moothart 它不会捕获像列空能力这样的变化,但我想如果从空列移动到非空列,这将被视为破坏性变化。
谢谢!以后会进一步研究这个问题,但现在 SchemaUpdate 是我正在寻找的。span>
【参考方案2】:
您可以只使用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
不会进行破坏性更新(删除表、列等)。它只会添加它们。
【讨论】:
太棒了!这正是我一直在寻找的。谢谢!以上是关于Fluent NHibernate - 仅在不存在时创建数据库模式的主要内容,如果未能解决你的问题,请参考以下文章
Fluent NHibernate:约定/KeyColumn
NHibernate 2 + Fluent Nhibernate 中等信任
用 Fluent Nhibernate 定义 NHibernate 过滤器的语法?