Domanda

Che cosa è il miglior modo più coerente per verificare se esiste una tabella in NHibernate (o con Fluent-NHibernate)?

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

Anche su una questione connessa, si può verificare se una serie di tabelle o di un intero schema esiste con NHibernate?

È stato utile?

Soluzione

Se si memorizza la configurazione NHibernate da qualche parte o farlo prima di costruire la vostra fabbrica di sessione è possibile convalidare lo schema generato sul database.

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

Altri suggerimenti

Ho guardato nel codice sorgente per SchemaUpdate. Sapevo SchemaUpdate in grado di rilevare una tabella mancante e quindi generare uno script creare, piuttosto che uno script di aggiornamento. Abbastanza sicuro, la risposta era lì dentro.

La funzione GetTableMetadata in oggetto NHibernate.Tool.hbm2ddl.DatabaseMetadata restituirà null se una tabella non esiste in un database.

Normalmente, SchemaUpdate crea un oggetto DatabaseMetaData e passa in in un oggetto Configuration. Ma sembra che tutto ciò che serve per creare un DatabaseMetaData è un oggetto DBConnection e dialetto.

SchemaUpdate crea un DatabaseMetaData nel seguente modo:

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

NHibernate.Cfg.Configuration chiama poi

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

Questa domanda e la risposta sono saltate fuori in tutto il mondo 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 maniera più precisa e 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 speranza che aiuta qualcuno perché ho implementato una strategia contorto simile al precedente prima di inciampare su questo;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top