2009-10-12 50 views
5

什麼是最好的,最一致的方式來檢查一個表是否存在於NHibernate(或與Fluent-NHibernate)?如何檢查NHibernate(或Fluent)是否存在表?

這有可能嗎?我的意思是這對於這樣一個重型ORM來說似乎是一個簡單的任務。

同樣在相關的問題上,你可以檢查一組表或整個模式是否存在與NHibernate?

+0

您是否希望檢查一下對你的映射? – 2009-10-13 00:05:11

+0

無論如何,我想看看物理表是否存在。 – 2009-10-13 01:39:53

回答

12

如果您保存您的NHibernate配置的地方或做你建立你的會話工廠之前,可以驗證所生成針對數據庫的模式。

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

不錯,我正在尋找這樣的事情 – 2009-10-14 19:14:47

3

我查看了SchemaUpdate的源代碼。我知道SchemaUpdate可以檢測到缺少的表,然後生成一個創建腳本,而不是一個更新腳本。果然,答案就在那裏。

NHibernate.Tool.hbm2ddl.DatabaseMetadata對象的GetTableMetadata函數將返回null如果表中不存在數據庫。

通常情況下,SchemaUpdate會創建一個DatabaseMetadata對象並將其傳遞給一個Configuration對象。但它看起來像創建DatabaseMetadata所需的只是一個DBConnection和Dialect對象。

SchemaUpdate工具創建一個DatabaseMetaData正是如此:

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

NHibernate.Cfg.Configuration然後調用

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

這個問題和應對谷歌這樣的解決搜索時彈出無處不在,所以我想我會放什麼更精確和簡潔的工作[由於問題的年齡,很可能是另外]我方式; 「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")) 
     { 
     ... 

希望幫助別人,因爲我實現了絆腳石上在此之前類似上述一個令人費解的戰略;)