【问题标题】:Using NHibernate to execute DDL statements使用 NHibernate 执行 DDL 语句
【发布时间】:2011-01-02 15:32:00
【问题描述】:

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

【问题讨论】:

    标签: nhibernate database-create


    【解决方案1】:

    我之前成功使用过session.Connection.CreateCommandsession.Transaction.EnlistCommand 运行原始SQL。

    这是我做过的类似事情的 sn-p:

    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())
            // ...
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我想让这个数据库不可知 - 有没有一种简单的方法可以做到这一点,例如Nhibernate 会给我一个 IDbCommand 吗?
      • 调用 IDbConnection.CreateCommand 返回一个 IDbCommand。但我认为除了简单的情况外,您无法实现与数据库无关的 DDL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      相关资源
      最近更新 更多