C# 使用NHibernate向Oracle数据库添加触发器

C# 使用NHibernate向Oracle数据库添加触发器,c#,oracle,nhibernate,C#,Oracle,Nhibernate,我正试图编写一个小程序,使用NHibernate从代码中生成我的DB表、序列和触发器 使用SchemaExport.Create()方法,我能够创建所有表和相关序列,但无法创建触发器。因此,我尝试使用session.CreateSQLQuery()来运行将触发器添加到DB的命令 我的代码如下所示: string createTriggerQuery= @"create or replace trigger table_insert_trigger before insert on Table f

我正试图编写一个小程序,使用NHibernate从代码中生成我的DB表、序列和触发器

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

我的代码如下所示:

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>
但这也不起作用


有人知道如何从代码中将触发器添加到数据库中吗

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

... into :new.ID from dual;
NHibernate将冒号(
)解释为参数的指示符,并将其替换为
(因为您实际上没有传递参数)。所以它实际上是在传递一个如下所示的SQL

into ? from dual
甲骨文对此表示不满

目前,NHibernate无法逃脱
并将其逐字传递到数据库,如前所述


在类似的约束条件下,解决方案是使用除NHibernate之外的
ORM
。如果这是必需的目的,那么NHibernate可能不是最佳选择

我也有同样的问题,有解决办法吗?也许创建一个执行该指令的存储过程?
into ? from dual