3

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

4

2 回答 2

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())
        // ...
    }
}
于 2010-01-07T19:50:36.753 回答
2

您可以从 ISession 的 Connection 属性中获取 IDbConnection,但您需要使用 SqlCommand 来执行此操作。执行 DDL 超出了 NHibernate 的范围。

于 2010-01-07T19:46:17.827 回答