2010-01-07 43 views
2

如何通過NHibernate執行DDL語句?使用NHibernate執行DDL語句

要清楚,我不要想要從我的映射文件自動生成我的模式。我的DDL存儲在純文本文件中:

CREATE TABLE Foo (Bar VARCHAR(10)) 
GO 
CREATE TABLE Hello (World INTEGER) 
GO 

我想循環遍歷這些命令並執行它們中的每一個。我可以打開一個SqlConnection,並通過SqlCommand執行,但如果有一個很好的方法來做到這一點,我想通過NHibernate。這主要是因爲我想盡可能保持數據庫不可知:我現在有一個SQL數據庫,但我可能需要稍後實現Oracle或DB2 ...

我使用.Net v3.51和NHibernate v2。 1。我查看了NHibernate SchemaExport類,但看不到用於此目的的方法。

回答

1

您可以從ISession的Connection屬性獲得IDbConnection,但您需要使用SqlCommand來完成此操作。執行DDL不在NHibernate的範圍內。

+0

我想使這個數據庫無關 - 有沒有這樣做例如一個簡單的方法Nhibernate會給我一個IDbCommand嗎? – Steve 2010-01-07 19:49:47

+1

調用IDbConnection.CreateCommand返回一個IDbCommand。但我不認爲你可以實現數據庫不可知的DDL,除了簡單的情況。 – 2010-01-07 19:54:01

3

我以前用session.Connection.CreateCommandsession.Transaction.EnlistCommand成功運行原始SQL。

下面是類似的一個片段,我已經做了:

using (var command = _session.Connection.CreateCommand()) 
{ 
    _session.Transaction.Enlist(command); 
    command.CommandText = "select foo from bar where id = @id"; 
    var versionIdParameter = command.CreateParameter(); 
    versionIdParameter.ParameterName = "id"; 
    versionIdParameter.Value = id; 
    command.Parameters.Add(versionIdParameter); 
    using(var reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) 
    { 
     while (reader.Read()) 
     // ... 
    } 
}