0

我正在尝试编写小程序,使用 NHibernate 从代码生成我的数据库表、序列和触发器。

使用SchemaExport.Create()方法我能够创建所有表和相关序列,但我无法创建触发器。因此,我尝试使用session.CreateSQLQuery()运行将触发器添加到数据库的命令。

我的代码如下所示:

string createTriggerQuery= @"create or replace trigger table_insert_trigger before insert on Table for each row begin select TableSequence.nextval into :new.ID from dual; end;";
var query = session.CreateSQLQuery(createTriggerQuery);
query.ExecuteUpdate();

该查询在我在 上运行时有效Oracle SQL Developer,但在执行代码时出现此异常:

Could not execute native bulk manipulation query:create or replace trigger... [SQL: SQL not available]

我还尝试使用 HBM 查询来创建查询。我将 XML 文件作为嵌入式资源添加到项目中,并在其上添加以下代码:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<database-object>
    <create>
        create or replace
        trigger table_insert_trigger before insert on table
        for each row
        when (new.ID is NULL)
        begin
        select tableSequence.nextval into :new.ID from dual;
        end;
    </create>

在我的FluentConfiguration成员中,我将其配置为添加 hbm 映射:

_fluentConfiguration.Mappings(m => m.HbmMappings.AddFromAssemblyOf<DbContextFactory>());

但这也不起作用。

有谁知道如何从代码中将触发器添加到我的数据库中?

4

1 回答 1

1

此特定实例中的问题是您尝试对数据库执行的查询,特别是这部分:

... into :new.ID from dual;

NHibernate将冒号 ( :) 解释为参数的指示符,并将其替换为?(因为您实际上并未传递参数)。所以它实际上是在传递一个看起来像这样的 SQL,

into ? from dual

在这一点上甲骨文抱怨。

目前,NHibernate 无法转义:并将其按字面意思传递给数据库,如此所述。

在类似的约束下,解决方案是使用ORMNHibernate 以外的其他方法。如果这是必需的目的,也许 NHibernate 不是最佳选择。

于 2013-01-16T21:33:16.330 回答