2009-10-12 12 views
5

NHibernate'de (veya Fluent-NHibernate ile) bir tablo olup olmadığını kontrol etmek için en iyi, en tutarlı yol nedir?NHibernate (veya Fluent) ile bir masa olup olmadığını nasıl kontrol edersiniz?

Bu mümkün mü? Yani böyle bir ağır iş ORM için basit bir görev gibi görünüyor.

Ayrıca ilgili bir soruda, NHibernate ile bir dizi tablo veya bütün bir şemanın var olup olmadığını kontrol edebilir misiniz?

+0

Eğer haritalama karşılaştırılmak üzere arıyorsunuz? –

+0

her iki şekilde de, fiziksel tablonun var olup olmadığını görmek istiyorum. –

cevap

12

çağırır veritabanına karşı şema. Böyle bir çözüm ararken

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

Güzel, Bu tür bir şey arıyordum –

3

SchemaUpdate için kaynak koduna baktım. SchemaUpdate'in eksik bir tablo algılayabileceğini ve daha sonra bir güncelleme komut dosyası yerine bir oluşturma betiği oluşturabileceğini biliyordum. Tabii ki, cevap oradaydı. nesnesindeki GetTableMetadata nesnesi, bir veritabanında bir tablo yoksa, null değerini döndürür.

Normal olarak, SchemaUpdate bir DatabaseMetadata nesnesi oluşturur ve Configuration nesnesine girer. Ama bir DatabaseMetadata oluşturmak için gereken her şey bir DBConnection ve Dialect nesnesi gibi görünüyor.

SchemaUpdate thusly bir DatabaseMetadata oluşturur:

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

NHibernate.Cfg.Configuration o zaman bir yerde size NHibernate yapılandırmayı saklayabilir ya da yaparsanız size oturum fabrika inşa önce oluşturulan doğrulamak mümkündür

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

bu soru ve yanıt google her yerde açıldı, bu yüzden ben daha kesin ve özlü benim için [nedeniyle soruların yaş, büyük olasılıkla bir ilave etmek] sonuçları nelerin koymak düşündüm tavır; "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")) 
     { 
     ... 

Umut Bu konuda tökezleyerek önce yukarıdaki benzer bir dolambaçlı bir strateji uygulamaya diye birilerini yardımcı olur;)