isessionfactory fluently database nhibernate fluent-nhibernate

database - fluently - ¿Es posible crear una base de datos utilizando NHibernate?



fluent nhibernate mapping (6)

Buscando esto yo mismo como lo he visto hecho en java - pregunta similar aquí: Generar base de datos desde archivos de configuración de NHibernate

Estoy usando NHibernate con FluentNHibernate para mi DAL. También estoy usando SchemaExport y SchemaUpdate para crear y actualizar el esquema de mi base de datos.

Mi problema es que todas las operaciones de esquema requieren que la base de datos exista antes de que funcionen. Quiero crear mi base de datos mediante programación y actualizar el esquema, ya que puede haber varias bases de datos y la creación de la base de datos no es solo una operación que se realiza una sola vez.

Sé que puedo hacer esto manualmente ejecutando un comando de creación de base de datos en una conexión a la base de datos maestra, pero esto se siente mal considerando que, de lo contrario, uso NHibernate para todas mis interacciones con la base de datos. Además, utilizo una base de datos en memoria SQLite para mis pruebas unitarias, por lo que cualquier sql que escriba tendrá que saber qué base de datos estoy usando.

¿Hay alguna forma de que NHibernate cree mi base de datos por mí?


Creo que crear db con NHibernate es bueno si empiezas a desarrollar una aplicación con un modelo de dominio. Quiero decir, da una idea de cómo debería verse tu db. Pero en general, se deben usar scripts de SQL.

Escuché que algunos desarrolladores usan NHibernate db generation para las pruebas de integración, crean dl sqlite liviano al vuelo.

¿Cómo generar db con NHibernate? Así es como hago eso:

public static void InitSessionFactory() { var connectionString = ConfigurationManager .ConnectionStrings["MyConnectionString"] .ConnectionString; var cfgFromXml = new Configuration(); cfgFromXml.Configure(); var cfg = Fluently.Configure(cfgFromXml) .Database(MsSqlConfiguration.MsSql2005 .ConnectionString(x => x.Is(connectionString)) .UseReflectionOptimizer()) .Mappings(x => x.FluentMappings .AddFromAssemblyOf<NHibernateBootstrapper>()) .ExposeConfiguration(BuildSchema); ObjectFactory.Inject(cfg.BuildSessionFactory()); } private static void BuildSchema(Configuration config) { //Creates database structure //new SchemaExport(config) // .Create(false, true); }



Hmm, de hecho puede usar SchemaExport como lo menciona, pero veo a NHibernate principalmente como una forma de cerrar la brecha entre el modelo de dominio OO y un almacenamiento de persistencia relacional. Es decir, para mí, el propósito de NHibernate es persistir y recuperar entidades en mi modelo de dominio.

Cuando quiera hacer actualizaciones de esquemas, imho, no debe usar NHibernate (si es posible), ya que ese no es el propósito de NHibernate; hay un ''lenguaje específico del dominio'' llamado SQL :) que es bueno para hacer esas cosas.

Para crear mi base de datos y actualizar el esquema de mi base de datos, utilizo Migrator.NET , que es un marco que le permite escribir clases de C # en el lugar que especifica lo que se debe hacer (crear una tabla, agregar una columna, etc. ..).
La ventaja de esto, es que Migrator.NET también es compatible con múltiples DBMS, por lo que no termina de escribir código SQL específico de DB.


No, NHibernate no creará la base de datos por ti. Crear bases de datos es algo que normalmente no se quiere hacer sobre la marcha. Necesita muchos parámetros de configuración y esto es muy específico de la base de datos, incluso la versión de la base de datos.

Para nuestro producto, escribí una clase que configura la base de datos. Se utiliza para el instalador, las pruebas de integración y la herramienta de mantenimiento de la base de datos.

  • NHibernate crea la conexión utilizando su configuración.
  • mi propia implementación crea la base de datos Hay diferentes implementaciones para diferentes dialectos.
  • NH crea las tablas y otros objetos de la base de datos.
  • Las clases del instalador crean datos iniciales

También hay un caso especial, donde un cliente no quiere otorgar el derecho de crear bases de datos. Entonces esperamos que lo haga y se salte esta parte.


Utilizamos SchemaExport para proporcionar un esquema y una tarea de Nant para eliminar y volver a crear la base de datos. Otra tarea de Nant ejecuta el código de exportación de datos y de datos que existe en forma de una prueba de integración ejecutada por la tarea nunit. Aquí hay una muestra .