使用NHibernate执行DDL语句

问题描述:

如何通过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类,但看不到用于此目的的方法。

您可以从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

我以前用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()) 
     // ... 
    } 
}