流畅的NHibernate - 仅在不存在的情况下创建数据库模式

时间:2011-05-04 13:43:24

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

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

2 个答案:

答案 0 :(得分: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();
}

有一点需要注意:SchemaUpdate不会进行破坏性更新(删除表,列等)。它只会添加它们。

答案 1 :(得分:10)

更新(感谢dotjoe)

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

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

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

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