我正在使用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 */
......一无所获。
有人会有任何建议吗?
谢谢, 罗布
答案 0 :(得分:0)
returning ID into :nhIdOutParam
将生成的ID放入名为nhIdOutParam的out参数中,NH将在命令中提供插入完成后获取id。