2009-10-12 8 views
5

Qual è il modo migliore e più coerente per verificare se esiste una tabella in NHibernate (o con Fluent-NHibernate)?Come si controlla se esiste una tabella con NHibernate (o Fluent)?

E 'anche possibile? Voglio dire, sembra un compito semplice per un ORM così pesante.

Inoltre, in una domanda correlata, è possibile verificare se un insieme di tabelle o un intero schema esiste con NHibernate?

+0

Siete alla ricerca di controllare contro la mappatura? –

+0

in entrambi i casi, voglio vedere se esiste la tabella fisica. –

risposta

12

Se si memorizza la configurazione NHibernate da qualche parte o farlo prima di costruire la vostra fabbrica di sessione è possibile convalidare l'generata schema contro il database.

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

Bello, stavo cercando questo genere di cose –

3

Ho cercato il codice sorgente per SchemaUpdate. Sapevo che SchemaUpdate poteva rilevare una tabella mancante e quindi generare uno script di creazione, piuttosto che uno script di aggiornamento. Abbastanza sicuro, la risposta era lì dentro.

La funzione GetTableMetadata nell'oggetto NHibernate.Tool.hbm2ddl.DatabaseMetadata restituisce null se una tabella non esiste in un database.

Normalmente, SchemaUpdate crea un oggetto DatabaseMetadata e passa in un oggetto Configuration. Ma sembra che tutto ciò che serve per creare un DatabaseMetadata sia un oggetto DBConnection e Dialect.

SchemaUpdate crea un DatabaseMetaData questa convenzione:

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

NHibernate.Cfg.Configuration poi chiama

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

Questa domanda e la risposta spuntato un po 'ovunque in google durante la ricerca di una soluzione del genere, così ho pensato di mettere ciò che ha funzionato [per questioni di età, molto probabilmente un'aggiunta] per me in una più precisa e succinta maniera; "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")) 
     { 
     ... 

Speranza che aiuta qualcuno perché ho implementato una strategia contorto simile al precedente prima di inciampare su questo;)

Problemi correlati