使用NHibernate将触发器添加到Oracle DB

时间:2013-01-16 14:50:01

标签: c# oracle nhibernate

我正在尝试编写一个小程序,它将使用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>());

但这也不起作用。

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

1 个答案:

答案 0 :(得分:1)

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

... into :new.ID from dual;

冒号(:)被NHibernate解释为参数的指示符,并用?代替它(因为你实际上没有传递参数)。所以它实际上传递了一个看起来像这样的SQL,

into ? from dual

此时甲骨文抱怨道。

目前,NHibernate没有办法逃脱:并将其传递给数据库,如here所示。

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

相关问题