Fluent NHibernate - 仅在不存在时创建数据库模式

sti*_*k81 36 .net database nhibernate fluent-nhibernate c#-4.0

我有一个应用程序,我使用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);
}
Run Code Online (Sandbox Code Playgroud)

注意" if (DbExists(config))".这就是我想做的.我只想在它实际上不存在的情况下创建模式.在下一步 - 如果它不是最新的,我想更新它.

我该如何实现这一目标?我期待一个config.DatabaseExists(),但我看不到这样的事情.我看到了hacky解决方案的一些可能性,但是处理这个问题的典型推荐方法是什么?

Gab*_*art 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();
}
Run Code Online (Sandbox Code Playgroud)

一个警告:SchemaUpdate不进行破坏性更新(删除表,列等).它只会添加它们.


Vad*_*dim 10

更新(感谢dotjoe)

Hbm2ddl只能执行模式差异,只能更新SchemaUpdate类更改的内容.然而,这个类非常简陋,因为它只需要查看当前实体以及模式的不同之处.如果已经进行了重大更改(即删除了实体或删除了链接表),它将无法解决这个问题.

在早期的项目中,我们使用了hbm2ddl,但是我们已经开始使用Fluent Migrator了.我想说最好的办法是使用迁移工具,如Fluent Migrator或Migrator.NET.

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

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