簡體   English   中英

Fluent NHibernate - 僅在不存在時創建數據庫模式

[英]Fluent NHibernate - Create database schema only if not existing

我有一個應用程序,我使用 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 解決方案的可能性,但是典型的推薦處理方法是什么?

您可以只使用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 class 更改的內容。 然而,這個 class 非常初級,因為它只查看當前實體以及架構的不同之處。 如果進行了重大更改(即刪除了實體或刪除了鏈接表),它將無法弄清楚。

在較早的項目中,我們使用了 hbm2ddl,但后來我們開始使用 Fluent Migrator。 我想說你最好的選擇是使用遷移工具,比如 Fluent Migrator 或 Migrator.NET。

http://github.com/schambers/fluentmigrator/

http://code.google.com/p/migratordotnet/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM