Frage

Was ist die beste, konsequenteste Art und Weise zu überprüfen, ob eine Tabelle in NHibernate vorhanden ist (oder mit Fluent-NHibernate)?

Ist es überhaupt möglich? Ich meine, es scheint wie eine einfache Aufgabe für einen solchen schweren ORM.

Auch auf einer verwandte Frage, können Sie überprüfen, ob eine Reihe von Tabellen oder ein ganzes Schema mit NHibernate existiert?

War es hilfreich?

Lösung

Wenn Sie Sie NHibernate Konfiguration irgendwo speichern oder es tun, bevor Sie Ihre Sitzung Fabrik bauen, ist es möglich, das generierte Schema für die Datenbank zu validieren.

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

Andere Tipps

sah ich in den Quellcode für SchemaUpdate. Ich wusste, dass SchemaUpdate eine fehlende Tabelle erkennen konnte und dann erzeugt ein Skript zu erstellen, anstatt ein Update-Skript. Sicher genug, war die Antwort da drin.

Die GetTableMetadata Funktion in NHibernate.Tool.hbm2ddl.DatabaseMetadata Objekt null zurück, wenn eine Tabelle in einer Datenbank existiert nicht.

Normalerweise schafft SchemaUpdate ein DatabaseMetaData Objekt und übergibt in einem Configuration Objekt. Aber es wie alle sieht man ein DBConnection und Dialect erstellen müssen ein DatabaseMetaData Objekt ist.

SchemaUpdate schafft eine DatabaseMetaData thusly:

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

NHibernate.Cfg.Configuration ruft dann

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

Diese Frage Antwort tauchte überall in Google, wenn für eine solche Lösung suchen, so dass ich dachte, ich würde setzen, was funktioniert hat [wegen Fragen Alter, höchstwahrscheinlich ein Zusatz] für mich in einer präziseren und prägnante Art und Weise; " 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"))
        {
        ...

Ich hoffe, das hilft jemand, weil ich vor Stolpern auf diesem eine gewundene Strategie ähnlich wie die oben umgesetzt;)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top