Fluent NHibernate-Crear esquema de base de datos solo si no existe


Tengo una aplicación donde uso Fluent Nhibernate para crear mi base de datos. Hasta aquí he estado recreando el esquema de base de datos cada vez. El código que hace esto es este:

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);
}

Note el "if (DbExists(config))". Esto es lo que me gustaría hacer. Me gustaría crear el esquema solo si realmente no existe. Y en el siguiente paso-me gustaría actualizar se creará si no está actualizado.

¿Cómo logro esto? Estoy esperando un config.DatabaseExists(), pero no puedo ver nada como esto. Me vea algunas posibilidades de una solución hacky, pero ¿cuál es la forma típica recomendada de manejar esto?

Author: Keith Hoffman, 2011-05-04

2 answers

Puede usar SchemaUpdate en su lugar, actualizará el esquema si existe y lo creará si no:

public NhibernateSessionFactory(IPersistenceConfigurer config)
{
    _sessionFactory = Fluently.Configure().
        Database(config).
        Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()).
        ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)).
        BuildSessionFactory();
}

Una advertencia: SchemaUpdate no hace actualizaciones destructivas (eliminar tablas, columnas, etc.).). Solo los añadirá.

 69
Author: Gabe Moothart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 14:39:46

ACTUALIZADO (gracias dotjoe)

Hbm2ddl solo es capaz de hacer una diferencia de esquema y solo actualizar lo que ha cambiado con la clase SchemaUpdate. Sin embargo, esta clase es bastante rudimentaria, ya que solo echa un vistazo a las entidades actuales y cómo difiere el esquema. Si se han realizado cambios significativos (es decir, entidades eliminadas o tablas de enlaces eliminadas), no podrá averiguarlo.

En un proyecto anterior utilizamos hbm2ddl, sin embargo, desde entonces hemos pasado a usar Fluent Migrator. Yo diría que su mejor apuesta es utilizar una herramienta de migración, como Fluent Migrator o Migrator.NET.

Http://github.com/schambers/fluentmigrator /

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

 10
Author: Vadim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-04 14:54:40