2010-08-13 64 views
3

是否有可能從nHibernate生成數據庫的模式,其中我已經向數據庫提供了nHibernate的配置,但是我沒有編寫任何映射。使用nHibernate檢索數據庫模式

我希望以編程方式獲取數據庫元數據/架構。

我正在使用Oracle數據庫。我曾嘗試兩種方法:

方法之一:

public DatabaseMetadata GetMetadata(DbConnection connectionIn) 
    { 
     return new DatabaseMetadata(connectionIn, _dialect); 
    } 

問題:這似乎是不過我需要什麼,儘管它正確連接時,它並沒有回升的的任何我的桌子。我所提供的全部是nHibernate配置對象,其中填充了我的nHibernate.xml.config文件(連接字符串,驅動程序客戶端等)的內容。

問題:爲什麼它不返回表數據?它連接正確,但什麼都沒發現!

方法二:

public void DatabaseSchema() 
{ 
    var schema = new SchemaExport(nHibernateConfiguration); 
    schema.SetOutputFile("schema.dll"); 
     schema.Create(true, true); 
} 

nHibernateConfiguration是NHibernate的配置對象,填充來自nHibernate.xml.config類內容的一個實例(在類的屬性)。

問題:這根本行不通。崩潰,但以下情況除外:

NHibernate.MappingException:方言 不支持身份密鑰 代

我懷疑這隻會基於映射你已經創建了一個模式?我沒有創建映射。這個想法是針對我連接到的任何數據庫生成一個模式。

問題:我相信這種方法只會根據我的映射生成一個Schema嗎?如果沒有,我是否正確使用它?

希望這已經夠清楚了,如果我需要提供更多信息,請發表評論。

在此先感謝。

要清楚:我有一個數據庫,並希望獲取代表數據庫的元數據,一個模式。

回答

3

NHibernate實際上是基於映射文件。你可以從它們生成類或表。有一些工具可以生成映射文件,但它們基於類而不是表。

回答您的具體問題:

方法之一: NHibernate的不從數據庫中讀取表定義。所有的表定義都需要在映射文件中指定。

方法二:SchemaExport從映射定義中創建一個SQL文件(創建表,索引等)。實際上建議使用它,除非您需要處理遺留數據庫。輸出文件應該被稱爲* .sql,而不是* .dll。

您得到的錯誤很可能是因爲您嘗試在Oracle數據庫(或不支持標識列的另一個數據庫)上創建身份標識。改用hilo(或者,如果你不喜歡它,guid.comb或native)。我只是想知道爲什麼你會得到這個錯誤,我認爲你沒有寫任何映射文件?

結論:

我不知道從數據庫表創建NHibernate的映射文件的任何工具。可能有一個,很可能它不是免費的或不成熟的(因爲否則它會是衆所周知的)。因此,我建議考慮生成表定義,或者,如果您有舊數據庫,則需要手動編寫映射文件。

+0

如果他的數據庫只有少數幾個字段,我會同意手動映射所有內容。否則,抓住一個工具,至少生成正確的成員名稱和映射。由於大多數工具似乎都有產生FK的問題(或者他的數據庫可能不會使用它們,如果它是遺留的)和關係類型,他可能只需要手動設置它們。 – Mike 2010-08-24 12:25:00

+0

乾杯。這有助於回到我遇到的問題的底部。 – Damien 2010-08-25 11:29:04

+0

llbgen是一個具有自動創建映射功能的程序:) – harry180 2012-10-11 08:53:35

1

我可能會解釋錯誤的問題,這是不是很清楚你要求什麼。

假設您已經創建了類並正確配置了NHibernate,並且希望爲這些類在數據庫中創建表,至少有兩種方法可以在不創建NHibernate映射的情況下生成數據庫,這兩種方法都可能有效至少有一些關於如何做映射提示要好得多:

Fluent NHibernate Automapper

ConfORM

有兩個選項一個體面的學習曲線。

另一種選擇是嘗試NHibernate的商業視覺設計師之一,雖然這些工具還不夠成熟,以至於我的經驗非常好。

核心NHibernate沒有設計或打算創建沒有映射文件的表。

+0

這與我所說的很接近。數據庫已經填充了表和列,我想導出模式......換句話說,我想要做與此相反的事情。 – Damien 2010-08-23 14:15:44

+0

你想要什麼格式的元數據/模式?你想要POCO類加上從數據庫中生成的NHibernate hbm.xml映射文件嗎?或者你想以不同格式的元數據如SQL腳本?您是否正在尋找.NET API進入數據庫元數據,比如SQL Server通過SMO提供的內容? – 2010-08-23 15:28:23

+0

.Net API將非常出色。否則POCO加nHibernate映射將會很方便。這主要是實驗性的。我需要決定最佳格式。我認爲數據庫元數據可以工作(隨nHibernate一起發佈) – Damien 2010-08-23 15:35:50

3

有幾種工具可以幫助您,但我使用最多的兩種工具是以下兩種。

  1. NHibernate Schema Tool
  2. NHibernate Mapping Generator

如果你已經有了可以使用的NHibernate映射生成器創建的映射的架構。然後,您可以使用任何你想要的映射。修改它們並使用NHibernate Schema Tool來管理實際的模式。

如果您沒有任何架構,並且您正在嘗試創建,那麼您就處於正確的軌道上。首先你需要「映射」你的課程。建議使用流暢的NHibernate或者像Michael Maddox這樣的ConfORM。

我不知道這個的目的。如果是數據庫模式管理,我會建議不要使用NHibernate。 NHibernate從未被開發爲模式管理器工具,所以它可能不應該以這種方式使用。無可否認,我可能會誤解你,這個答案可能是完全錯誤的。

+0

如果您最終使用NHibernate Mapping Generator,那麼您可能會遇到從Oracle數據庫中獲取所有表的問題。我昨天使用它,不得不改變哪些表用於獲取表名和約束。 – Mike 2010-08-24 12:25:51

相關問題