2009-06-15 9 views
8

Entonces, usuario novato de NHibernate; tratando de envolver mi cerebro alrededor de eso.¿Puede NHibernate comprobar si se ha generado el esquema db?

Estoy considerando cómo manejar la implementación y la posterior inyección de complementos en una aplicación web (que puede requerir sus propias clases de persistencia).

Estaba pensando que usar SchemaExport para el despliegue funcionaría bastante bien, pero me preguntaba si hay una forma de conseguir que NHibernate me diga de una manera común, basada en código, que ya se ha realizado una exportación de esquema, o no. Básicamente, lo que quiero hacer smething como en este pseudocódigo:

if(!_cfg.HasSchemaForType(typeof(MyType)) 
     ExportSchema(typeof(MyType)); 
    else 
     UpdateSchema(typeof(MyType)); 

donde las dos funciones utilizarían internamente SchemaExport o SchemaUpdate, respectivamente.


EDIT: Chicos, Agradezco la respuesta hasta el momento, pero les falta un poco el punto. Lo que estoy tratando de configurar es una forma para que la aplicación permita la adición y eliminación de complementos que pueden requerir cambios en la base de datos. No estoy hablando de versionar mi propio código o similar (al menos no como su función principal). Por lo tanto, la pregunta es menos sobre cuándo implementar la aplicación y más sobre cuándo agrego o elimino un complemento. ¿Se ha implementado este complemento (por lo tanto, la comprobación de tipo de pseudocódigo) anteriormente? Si es así, ejecuta la actualización. Si no, ejecuta la exportación. ¿Tener sentido?

Respuesta

3

No, NHibernate no hace lo que está preguntando. Me imagino que sería posible escribir algún código que exportara el esquema y luego lo comparara con el esquema de la base de datos. Pero probablemente sería más fácil exportar a una base de datos temporal y usar una herramienta de terceros, como Redgate SQL Compare, para comparar los esquemas.

Incluso si hizo lo que está preguntando, no veo cómo eso podría ayudar con la implementación porque su propósito es crear una base de datos desde cero.

Editado para agregar: Suponiendo que cada plugin tiene su propio conjunto de tablas, se puede determinar si el esquema se ha desplegado usando uno de varios métodos:

  • intento de cargar uno de los objetos de plugin y coger el excepción.
  • Examine el esquema de la base de datos (utilizando SMO para SQL Server) para verificar si existen las tablas.
  • Crea un registro en una tabla cuando se implementa un complemento.
+1

No estoy intentando resolver el problema de la implementación de la aplicación. Agregué algunas notas adicionales para aclarar. ¡Gracias por su respuesta! – Paul

+0

No creo que quiera decir en el momento del despliegue ... esto tendría que ser en tiempo de ejecución o de inicialización ... los complementos deberían ser responsables de sus propias dependencias. – Webjedi

+0

Gracias; Marqué el suyo como "respondido" porque era el más completo. Creo que tener una preocupación aparte de que las pistas de los complementos que se han implementado es probablemente la mejor ruta, como sugiere en su tercera viñeta. – Paul

0

Si tiene VS Team Suite o la edición del Desarrollador de bases de datos, puede sincronizar y realizar un seguimiento de los cambios y luego crear un script de despliegue que creará todos los objetos correctos para usted. Además, RedGate tiene un producto Schema Compare que hace lo mismo si no me equivoco.

+0

No tengo ninguna versión de VS, pero no estoy tratando de administrar esto en el nivel de desarrollador; la intención es crear una aplicación desplegable que los administradores puedan agregar/eliminar complementos. – Paul

2

El objetivo de la exportación del esquema es generar el esquema completo desde cero. Realmente útil si aún no ha implementado su aplicación.

Después de la primera implementación, recomiendo encarecidamente el uso de una herramienta de migraciones que lo ayudará con otras ampliaciones/modificaciones del esquema. Si piensa un poco más adelante, notará que incluso requiere manipulación de datos (por ejemplo, eliminar datos erróneos que se han generado debido a un error) a medida que su aplicación evoluciona. Eso es todo lo que una herramienta de migración puede ayudarlo.

echar un vistazo a:

Aquí es una lista de más herramientas de migración para .NET contestadas en una pregunta: SO

El origen La idea de las migraciones se originó en Ruby on Rails y ha sido "clonada" en otros marcos en el pasado. Es por eso que definitivamente es bueno leer acerca de la idea original al http://guides.rubyonrails.org/migrations.html también.

+0

Correcto, sé la diferencia entre SchemaExport y SchemaUpdate; es por eso que quería poder detectar si el guion inicial ya se ha ejecutado. – Paul

16

Creo que lo que estás buscando es SchemaUpdate.Execute en lugar de usar SchemaExport. SchemaUpdate creará el esquema si aún no existe, o lo actualizará si es necesario y lo desea.

Eso funciona para mí usando tanto MSSQL como SQLite.

new SchemaUpdate(config).Execute(false, true); 
9

Sí hay, de al menos 3,0

public static bool ValidateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg); 
    try 
    { 
     myvalidator.Validate(); 
     myvalidator = null; 
     return true; 
    } 
    catch (Exception ex) 
    { 
     MsgBox(ex.Message, "Schema validation error"); 
    } 
    finally 
    { 
     myvalidator = null; 
    } 

    return false; 
} 

Para la parte de la actualización, lo hacen.

public static void UpdateSchema() 
{ 
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg); 
    schema.Execute(false, true); 
    schema = null; 
} // UpdateSchema 
Cuestiones relacionadas