Pregunta

Así, novato NHibernate usuario; tratando de envolver mi cerebro alrededor de ella.

Estoy contemplando cómo manejar el despliegue y la posterior inyección de complementos para una aplicación web (que puede exigir a sus propias clases de persistencia).

Yo estaba pensando que el uso de SchemaExport para el despliegue podría funcionar bastante bien, pero me preguntaba si hay una manera demasiado conseguir NHibernate que me diga de una manera común, basada en código que una exportación esquema se ha hecho ya, 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, yo apreciamos la respuesta hasta ahora, pero que se está perdiendo el punto un poco. Lo que estoy tratando de establecer es una manera para que la aplicación permite la adición y la eliminación de los complementos que pueden requerir cambios en el PP. No estoy hablando acerca de las versiones de mi propio código o similar (al menos, no como su función principal). Así que la pregunta es menos acerca de cuándo puedo implementar la aplicación, y más acerca de cuándo puedo añadir o eliminar un plug-in. Se ha desplegado plugin de Theis (de ahí el tipo de comprobación pseudo-código) antes? Si es así, ejecute la actualización. Si no es así, ejecute la exportación. Tiene sentido?

¿Fue útil?

Solución

No, NHibernate no hace lo que preguntas. Me imagino que sería posible escribir un código que exporta el esquema y luego lo comparó con el esquema de base de datos. Pero probablemente sería más fácil exportar en una base de datos temporal y el uso de una herramienta de 3 ª parte, como Redgate SQL Compare, para comparar los esquemas.

Incluso si lo hiciera lo que preguntas, no veo la forma en que ayudaría con el despliegue porque su propósito es crear una base de datos a partir de cero.

Editado para añadir: 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 plugin y detectar la excepción.
  • Examinar el esquema de base de datos (utilizando SMO para SQL Server) para comprobar si existe la tabla (s).
  • Crear un registro en una tabla cuando se despliega un plug-in.

Otros consejos

Creo que lo que busca es SchemaUpdate.Execute en lugar de utilizar SchemaExport. SchemaUpdate creará el esquema si no existe ya, o actualizarlo si es necesario y deseado.

Esto funciona para mí utilizando tanto MSSQL y SQLite.

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

Si no 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, hacer.

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

El objetivo de exportación de esquemas es generar el esquema completo desde cero. Realmente útil si no se ha desplegado su aplicación todavía.

Después de que el primer despliegue Yo recomendaría el uso de una herramienta de migraciones, que le ayudará con otras extensiones / modificaciones del esquema. Si piensa que un poco más adelante se dará cuenta de que incluso se requiere la manipulación de datos (por ejemplo, la eliminación de datos incorrecto que se ha generado debido a un error) como su aplicación evoluciona. Eso es todo una herramienta de migración le puede ayudar con.

Tome una mirada en:

A continuación se muestra una lista de más herramientas de migración para .NET contestadas en una pregunta SO:

La idea original de las migraciones se originó a partir de Ruby on Rails y ha sido "clonado" en otros marcos en la última. Es por eso que es definitivamente bueno para leer acerca de la idea original en http://guides.rubyonrails.org/migrations. html también.

Si usted tiene VS Team Suite o la edición de Bases de Datos, puede sincronizar y realizar un seguimiento de los cambios y luego hacer un script de implementación que va a crear todos los objetos adecuados para usted. También Redgate tiene un producto de comparación de esquemas que hace lo mismo que si no me equivoco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top