Идентификаторы Nhibernate с последовательными пошаговыми идентификаторами (альтернативы HiLo) - PullRequest
2 голосов
/ 20 мая 2010

Как я могу дать Nhibernate команду генерировать последовательные первичные ключи за один шаг, как сгенерированные sql?

Текущий алгоритм HiLo генерирует ключи типа 4001, затем 5010, 6089 и т. Д. Я понимаю, что это управление несколькими серверами приложений и т. Д. Но у меня нет этой проблемы.
Мне нужно, чтобы nhibernate взял самое высокое значение набора записей во время запуска (скажем, 15), а затем сгенерировал следующую запись с первичным ключом 16 (очень похоже на сгенерированные идентификаторы со стороны sql).

Ответы [ 2 ]

1 голос
/ 20 мая 2010

Создать таблицу:

CREATE TABLE `seq` (
  `ID` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  `HI` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `seq` VALUES ('COMMENT', '0');
INSERT INTO `seq` VALUES ('POST', '0');
INSERT INTO `seq` VALUES ('USER', '0');

Добавьте сопоставления как это с FluentNHbiernate:

    public class Comment_Map : ClassMap<Comment>
    {
        public Comment_Map()
        {
            Table("COMMENT");

            Id(x => x.ID, "ID").GeneratedBy.HiLo("SEQ", "HI", "0", o => o.AddParam("where", "ID = 'COMMENT'"));
        }
     }
1 голос
/ 20 мая 2010

Зачем вам нужно ожидать, что NHibernate сделает это за вас?

Для NHibernate трудно предоставить общее решение для подобных сценариев, так как требования могут незначительно отличаться, но, поскольку вы точно знаете свои конкретные ограничения, вам будет относительно просто предоставить собственное решение идентификаторы, назначенные вручную).

При запуске приложения запросите базу данных и получите текущее значение максимального идентификатора. Увеличивайте это значение каждый раз, когда вы делаете вставку.

...