2009-05-27 23 views
17

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.¿Es posible crear una base de datos usando NHibernate?

Mi problema es que las operaciones de esquema requieren que la base de datos exista antes de que funcionen. Deseo crear programáticamente mi base de datos y actualizar el esquema, ya que puede haber múltiples bases de datos y la creación de la base de datos no es solo una operación única.

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 master, pero me parece incorrecto teniendo en cuenta que utilizo NHibernate para todas las interacciones de mi base de datos. Como comentario aparte, utilizo una base de datos SQLme inmemory para las pruebas de mi unidad, 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?

Respuesta

1

Echa un vistazo a RhinoCommons. En Rhino.Commons.ForTesting, en UnitOfWorkTestContextDbStrategy.cs, Ayende ha realizado alguna rutina allí que crea bases de datos.

+0

Gracias, voy a usar esto, no es realmente lo que quería (NHibernate haciendo el trabajo) pero es genial. Me sorprendió ver una referencia de servidor db "(local)" codificada :-) – Andrew

1

Hmm, puedes usar SchemaExport como mencionas, pero veo NHibernate primaramente 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 esquema, no debe usar NHibernate (si es posible), ya que ese no es el propósito de NHibernate; hay un 'lenguaje específico de dominio' llamado SQL :) que es bueno para hacer esas cosas.

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

+0

Gracias, estoy teniendo un vistazo a Migrator.Net, se ve muy bien, aunque no resuelve mi problema de realmente crear la base de datos. – Andrew

12

Creo que crear db con NHibernate es agradable, si comienza a desarrollar aplicaciones con el modelo de dominio. Es decir, da una idea de cómo debería verse tu DB. Pero, en general, se deben usar scripts sql.

Escuché que algunos desarrolladores usan NHibernate db generation para pruebas de integración, crean sqlite liv db on fly.

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

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

No, NHibernate no creará la base de datos para usted. Crear bases de datos es algo que generalmente no desea que se haga 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 específica.

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 mediante 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
  • clases instalador crean datos iniciales

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

+2

La creación de una base de datos SqlCe toma solo una línea de código: new SqlCeEngine (string.Format ("Data Source = '{0}';", path)) .CreateDatabase(); – HappyNomad

+1

Sí, la creación de una base de datos de servidor sql utilizando configuraciones predeterminadas no es más complicada. Pero este no es el punto. NH no lo hace porque tendría mucho sentido. –

+0

Esto ya no es exactamente así. Con NH3 puede usar hbm2ddl como parte del espacio de nombres NHibernate.Tool – Dann

5

Utilizamos SchemaExport para proporcionar un esquema y una tarea de Nant para descartar y volver a crear la base de datos. Otra tarea de Nant ejecuta el código de exportación y carga de datos del esquema que existe en forma de una prueba de integración ejecutada por la tarea nunit. Hay un sample here.

+1

+1 Yepm acaba de usar (nuevo SchemaExport (cfg)). Crear. Trabajo hecho. –

+0

Este código parece haberse movido a http://codecampserver.codeplex.com/SourceControl/changeset/view/4755c1386bff#nant.build – synhershko

Cuestiones relacionadas