FNhibernate, GeneratedBy.HiLo, hibernate_unique_key и т. Д. - PullRequest
0 голосов
/ 13 мая 2010

Я начал использовать архитектуру s # arp, которая использует FNhibernate и GeneratedBy.HiLo для генерации первичных ключей (есть также таблица hibernate_unique_key). Видимо, это рекомендуемая практика, и я хотел бы придерживаться этого. Теперь к моей проблеме. Я довольно часто использовал NHibernate и hbm mapping и обычно использовал идентификационные столбцы для моих первичных ключей. Это позволило мне заполнить базу данных с помощью SQL. Могу ли я сделать это с помощью вышеупомянутой настройки (таблица hibernate_unique_key и т. Д.). Мне нужно сделать это, так как вставка SQL намного эффективнее, чем использование NHibernate + C # для заполнения базы данных миллионами сущностей. Любая обратная связь будет очень ценится. Благодарю.

Christian

Ответы [ 3 ]

3 голосов
/ 05 августа 2010

Возможно, уже немного поздно, но генератор идентификаторов нарушит шаблон UnitOfWork.

Если вы выполняете сохранение для вашей текущей сессии, оно уже попытается вставить сущность в БД и, таким образом, разрушит весь смысл UoW. После многих часов я нашел причину, почему она была сломана, и причина была в этом Генераторе идентичности. Я сейчас использую генератор HiLo.

Следующие ссылки помогли мне через это:

Хорошая статья о поведении этих генераторов

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

Вы должны иметь возможность заполнять базу данных, используя простой SQL, и при этом использовать HiLo для генерации первичных ключей в NHibernate. Что вам нужно сделать, так это установить для значений NextHi в таблице HiLo значения, которые достаточно высоки, чтобы следующая сохраняемая вами сущность получала идентификатор, превышающий максимальный идентификатор, установленный при заполнении базы данных.

Итак, вы должны быть в состоянии сделать что-то вроде этого:

  • запустить экспорт схемы
  • заполнить базу данных с помощью пользовательского сценария sql (вы должны будете указать свои собственные идентификаторы в сценарии, поскольку они не генерируются базой данных)
  • вручную вставить достаточно большое значение в таблицу hibernate_unique_key, чтобы следующий идентификатор, сгенерированный NHibernate, был больше, чем самый большой, вставленный в начальное число
  • использовать NHibernate как обычно

Существует несколько разных подходов к использованию HiLo с NHibernate (один разделен следующим-привет для всех объектов, следующий - для каждого объекта и т. Д.), Поэтому вам, возможно, придется немного поэкспериментировать, чтобы выяснить, какие значения было бы целесообразно записать в таблицу hibernate_unique_key после заполнения, в зависимости от вашей стратегии hilo и того, какой max_lo вы используете и т. д.

В качестве примечания: экспорт схемы, похоже, не поддерживает несколько строк в таблице hibernate_unique_key, поэтому вам, возможно, придется выполнить некоторые ручные операции для создания всех строк в таблице, если вы используете строку hilo для каждой сущности.

Вы также можете использовать Identity для генерации идентификаторов, но за счет снижения производительности с NHibernate. Причиной потери производительности является то, что NHibernate должен выполнить дополнительное чтение для каждой вставки, чтобы получить идентификатор, сгенерированный базой данных. С hilo NHibernate уже знает идентификатор, который получит объект, поэтому нет необходимости в дополнительном чтении.

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

0 голосов
/ 13 мая 2010

Думаю, проблема в том, что генерация pk контролируется nhibernate, а не db. поэтому вариант будет использовать instance.GeneratedBy.Identity (). ты считаешь, что это было бы разумно?

Буду очень признателен за любые комментарии.

Christian

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...