【问题标题】:Fluent NHibernate - Create database schema only if not existingFluent NHibernate - 仅在不存在时创建数据库模式
【发布时间】:2023-03-03 19:16:01
【问题描述】:

我有一个使用 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 解决方案的可能性,但是典型的推荐处理方法是什么?

【问题讨论】:

    标签: .net database nhibernate c#-4.0 fluent-nhibernate


    【解决方案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 不会进行破坏性更新(删除表、列等)。它只会添加它们。

    【讨论】:

    • 太棒了!这正是我一直在寻找的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多