2011-05-04 5 views
32

Tengo una aplicación donde uso Fluent Nhibernate para crear mi base de datos. Hasta aquí he estado recreando el esquema de la base de datos cada vez. El código que hace esto es la siguiente:Fluido NHibernate - Crear esquema de base de datos solo si no existe

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

Nota del "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 para que se cree si no está actualizado.

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

Respuesta

67

Usted sólo puede utilizar SchemaUpdate lugar, se actualizará el esquema si existe y crearlo si no lo hace:

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 lo hace hacer actualizaciones destructivas (colocar tablas, columnas, etc.). Solo los agregará.

+0

¡Fantástico! Esto es exactamente lo que estaba buscando. ¡Gracias! – stiank81

+0

¡Perfecto! Gracias – Bronek

9

ACTUALIZADO (dotjoe gracias)

hbm2ddl sólo es capaz de hacer un diff esquema y sólo la actualización de 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 a cómo difiere el esquema. Si se han realizado cambios significativos (es decir, entidades eliminadas o tablas de enlaces eliminadas), no podrá darse cuenta de eso.

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

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

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

+0

en realidad Hbm2ddl puede generar scripts alternos con 'SchemaUpdate' ... pero no capta todo y nunca confiaría en él. – dotjoe

+0

@dotjoe ¿se está refiriendo al hecho de que no hace actualizaciones destructivas? Utilizo SchemaUpdate en producción y nunca he tenido un problema al no detectar algo. –

+0

@Gabe Moothart no detectará cambios como la capacidad nula de la columna, pero supongo que se consideraría un cambio destructivo si se pasa de una columna nula a una columna no nula. – dotjoe

Cuestiones relacionadas