Int64到NUMBER(18)ID转换错误

时间:2012-02-23 13:37:13

标签: c# oracle nhibernate fluent-nhibernate oracle10g

我正在使用Fluent NHibernate作为我的Oracle 10g数据库的ORM层,并在插入记录时使用before insert触发器创建唯一的id(带序列)。

-- Within the trigger
SELECT myseqgen.nextval into :NEW.ID FROM DUAL;

代码中的id属性是一个long(Int64),它不能更改为十进制,以便更好地匹配我们在数据库(公共库)中的内容。我把它映射如下:

this.Id(x => x.Id, "ID")
    .CustomSqlType("NUMBER(18)")
    .CustomType(typeof(IdCustomType))
    .GeneratedBy.TriggerIdentity();

虽然我已经为此属性创建了自定义类型,但我认为我不需要它,因为在数据库中,ID配置如下:

CREATE TABLE "SOME_SCHEMA"."MY_TABLE" 
    ("ID" NUMBER(18,0), -- 18 means "anything up to 64 bit integer"
    ...

然而有趣的是,在我的IdCustomType类的NullSafeSet方法中,“value”参数以小数形式传递。

...不仅如此,但在检查NHProf时,插入语句令人担忧地变为:

INSERT INTO MY_TABLE
        (COL_ONE,
         COL_TWO,
         COL_THREE,
         COL_FOUR,
         COL_FIVE,
         COL_SIX,
         COL_SEVEN)
VALUES      ('param one' /* :p0 */,
         'param two' /* :p1 */,
         NULL /* :p2 */,
         'param three' /* :p3 */,
         TIMESTAMP '2012-01-01 00:00:00.00' /* :p4 */,
         '22' /* :p5 */,
         '''81189'' [Type: String (5)], :nhIdOutParam = NULL' /* :p6 */)  -- WHAT!?
returning ID into :nhIdOutParam

在insert语句之后,将调用我的并发标识符的自动选择:

SELECT someRow_.CONCURRENCY_COL as CON_2_1_
FROM   MY_TABLE someRow_
WHERE  someRow_.ID = 5836738 /* :p0 */

......一无所获。

有人会有任何建议吗?

谢谢, 罗布

1 个答案:

答案 0 :(得分:0)

oracle使用语法returning ID into :nhIdOutParam将生成的ID放入名为nhIdOutParam的out参数中,NH将在命令中提供插入完成后获取id。