Pregunta

¿Cuál es la mejor manera, más consistente para comprobar si existe una tabla en NHibernate (o con Fluido-NHibernate)?

¿Es posible? Me refiero a que parece una tarea sencilla para un ORM como de alta resistencia.

También en una pregunta relacionada, se puede comprobar si existe un conjunto de tablas o la totalidad de un esquema con NHibernate?

¿Fue útil?

Solución

Si usted almacena la configuración de NHibernate en algún lugar o hacerlo antes de construir su fábrica de sesiones es posible validar el esquema generado frente a la base de datos.

    public void ValidateSchema(Configuration config)
    {
        new SchemaValidator(config).Validate();
    }

Otros consejos

Me miré en el código fuente de SchemaUpdate. Yo sabía SchemaUpdate podría detectar una mesa que faltan y luego generar un script crear, en lugar de una secuencia de comandos de actualización. Efectivamente, la respuesta estaba allí.

La función GetTableMetadata en el objeto NHibernate.Tool.hbm2ddl.DatabaseMetadata devolverá un valor nulo si una tabla no existe en una base de datos.

Normalmente, SchemaUpdate crea un objeto DatabaseMetaData y pasa en en un objeto Configuration. Pero parece que todo lo que necesita para crear un DatabaseMetaData es un objeto DBConnection y dialecto.

SchemaUpdate crea una DatabaseMetaData de esta manera:

connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);

NHibernate.Cfg.Configuration entonces llama

ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);

Esta pregunta y la respuesta aparecido por todas partes en Google cuando se busca una solución de este tipo, así que pensé que volvería a poner lo que funcionó [por cuestiones de edad, lo más probable realizó una adición] para mí de una manera más precisa y concisa; " iStable ":

var configuration = Fluently.Configure()
    .Database(MsSqlConfiguration
    .MsSql2008
    ...
    .BuildConfiguration();

    var session = configuration.BuildSessionFactory().OpenSession();

    DatabaseMetadata meta = new DatabaseMetadata((DbConnection)session.Connection, new NHibernate.Dialect.MsSql2008Dialect());
    //TABLE_NAME e.g. "hibernate_unique_key"
        if (meta.IsTable("TABLE_NAME"))
        {
        ...

La esperanza que ayuda a alguien porque he implementado una estrategia complicada similar a la anterior antes de tropezar en esta;)

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