Я использую Fluent NHibernate в качестве слоя ORM для своей базы данных Oracle 10g и использую триггер перед вставкой для создания уникального идентификатора (с последовательностью) при вставке записи.
-- 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();
Хотя я создал собственный тип для этого свойства, я не думаю, что он мне нужен, потому что в базе данных идентификатор настроен следующим образом:
CREATE TABLE "SOME_SCHEMA"."MY_TABLE"
("ID" NUMBER(18,0), -- 18 means "anything up to 64 bit integer"
...
Что интересно, так это то, что внутри метода NullSafeSet моего класса IdCustomType параметр «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
После оператора вставки вызывается автоматический выбор моего идентификатора параллелизма:
SELECT someRow_.CONCURRENCY_COL as CON_2_1_
FROM MY_TABLE someRow_
WHERE someRow_.ID = 5836738 /* :p0 */
... ничего не найдено.
Есть ли у кого-нибудь предложения?
Спасибо, Роб