Wie überprüfen Sie, ob eine Tabelle mit NHibernate (oder fliessend) existiert?
-
21-09-2019 - |
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?
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;)