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 - 仅在不存在时创建数据库模式的主要内容,如果未能解决你的问题,请参考以下文章

在不加入的情况下运行 NHibernate 查询

Fluent NHibernate:约定/KeyColumn

NHibernate 2 + Fluent Nhibernate 中等信任

用 Fluent Nhibernate 定义 NHibernate 过滤器的语法?

Fluent NHibernate and Mysql,SQLite

Fluent NHibernate - NHibernate.QueryException:无法解析属性