2009-10-12 11 views
5

¿Cuál es la mejor y más consistente manera de comprobar si existe una tabla en NHibernate (o con Fluent-NHibernate)?¿Cómo verifica si existe una tabla con NHibernate (o Fluent)?

¿Es posible? Quiero decir que parece una tarea simple para un ORM tan resistente.

También en una pregunta relacionada, ¿puede verificar si existe un conjunto de tablas o un esquema completo con NHibernate?

+0

¿Desea para comprobar que en contra de su asignación? –

+0

de cualquier manera, quiero ver si existe la tabla física. –

Respuesta

12

Si se almacena la configuración de NHibernate en algún lugar o hacerlo antes de construir su fábrica de sesiones es posible validar la generada esquema contra la base de datos.

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

Bien, estaba buscando este tipo de cosas –

3

Miré en el código fuente para SchemaUpdate. Sabía que SchemaUpdate podría detectar una tabla faltante y luego generar una secuencia de comandos de creación, 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á nulo si una tabla no existe en una base de datos.

Normalmente, SchemaUpdate crea un objeto DatabaseMetadata y lo transfiere a un objeto Configuration. Pero parece que todo lo que necesita para crear un DatabaseMetadata es un objeto DBConnection y Dialect.

SchemaUpdate crea una DatabaseMetaData así:

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

NHibernate.Cfg.Configuration llama entonces

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

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 sucinta manera; "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 de que ayude a alguien porque he implementado una estrategia complicada similar a la anterior antes de tropezar en esta;)

Cuestiones relacionadas