2009-10-12 17 views
5

Jaki jest najlepszy, najbardziej spójny sposób sprawdzenia, czy tabela istnieje w NHibernate (lub Fluent-NHibernate)?Jak sprawdzić, czy tabela istnieje z NHibernate (lub Fluent)?

Czy to możliwe? Mam na myśli, że wydaje się to prostym zadaniem dla tak ciężkiej ORM.

Również w pokrewnym pytaniu, czy możesz sprawdzić, czy zestaw tabel lub całego schematu istnieje z NHibernate?

+0

Szukasz sprawdzić go przed swoim mapowania? –

+0

tak czy inaczej, chcę sprawdzić, czy tabela fizyczna istnieje. –

Odpowiedz

12

Jeśli przechowujesz ci konfiguracji NHibernate gdzieś lub zrobić to zanim zbudować fabryki sesji możliwe jest, aby sprawdzić poprawność wygenerowanego schemat względem bazy danych.

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

Dobrze, szukałem tego typu rzeczy –

3

Sprawdziłem kod źródłowy dla SchemaUpdate. Wiedziałem, że SchemaUpdate może wykryć brakującą tabelę, a następnie wygenerować skrypt tworzenia, a nie skrypt aktualizacji. Rzeczywiście, odpowiedź była tam.

Funkcja GetTableMetadata w obiekcie NHibernate.Tool.hbm2ddl.DatabaseMetadata zwróci wartość null, jeśli tabela nie istnieje w bazie danych.

Normalnie SchemaUpdate tworzy obiekt DatabaseMetadata i przekazuje go do obiektu Configuration. Ale wygląda na to, że wszystko, czego potrzebujesz, aby utworzyć DatabaseMetadata to obiekt DBConnection and Dialect.

SchemaUpdate tworzy DatabaseMetaData wygląda następująco:

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

NHibernate.Cfg.Configuration następnie wywołuje

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

To pytanie odpowiedzi pojawiło się wszędzie w google, szukając takiego rozwiązania, więc myślałem, że chciałbym umieścić co pracował [ze względu na kwestie wieku, najprawdopodobniej dodatek] dla mnie w sposób bardziej precyzyjny i zwięzły sposób; „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")) 
     { 
     ... 

nadzieję, że pomoże ktoś bo wdrożył zawiłe strategię podobną do powyższego przed potykając się na to;)