我正在尝试编写一个小程序,它将使用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>());
但这也不起作用。
有谁知道如何从代码中将触发器添加到我的数据库中?
答案 0 :(得分:1)
此特定实例中的问题是您尝试对数据库执行的查询,特别是此部分:
... into :new.ID from dual;
冒号(:
)被NHibernate解释为参数的指示符,并用?
代替它(因为你实际上没有传递参数)。所以它实际上传递了一个看起来像这样的SQL,
into ? from dual
此时甲骨文抱怨道。
目前,NHibernate没有办法逃脱:
并将其传递给数据库,如here所示。
在类似的约束下,解决方案是使用除NHibernate之外的ORM
。如果这是必需的目的,NHibernate可能不是最好的选择。