2010-11-12 2 views
0

Я пытаюсь найти наиболее эффективный способ запуска нескольких (> 1000) вставных операторов с помощью NHibernate.Как я могу запустить несколько вложений с помощью NHibernate за один раз?

Фактический оператор вставки очень прост, так как он использует FK ID из вновь созданного объекта вместе со значениями из подзапроса. Вот что я хотел бы написать в SQL:

insert into dbo.NotificationView 
select 
    1 AS IDOfNewItem, 
    U.Id AS UserID, 
    0 AS HasEdited 
from 
    [User] U 
    INNER JOIN UserSite US ON U.Id = US.UserId 
where 
    US.SiteId = 1 

Я видел, что есть параметр называется adonet.batch_size (NHibernate: insert multiple items at once), которые могут быть установлены в файле XML «зимуют-конфигурацию», но это, кажется, что это будет просто создать то же количество insert утверждений, поскольку есть объекты.

Есть ли способ запустить вставку за один раз, без повторения каждого элемента?

Если да, то это отрицательно влияет на кеш?

ответ

1

adonet.batch_size работы, до тех пор, как:

  • Вы используете поддерживаемый DB (SQL Server, не уверен, что о Oracle)
  • Вы используете поддерживаемый генератор (например, идентичность не работает)
  • Вы ничего не делаете «странно» со своими сущностями.

Во всяком случае, похоже, что вы пытаетесь сделать объемную вставку, которая совершенно не связана.

Вы можете выполнить это с помощью DML-style operations в HQL.

+0

adonet.batch_size работает с Oracle. Я считаю, что поддержка добавлена ​​в 2.X таймфрейме. (Я использовал его в своем последнем проекте.) Одно слово предупреждения ... Поставщик Oracle в NH 2.X не создает правильные сообщения о протоколировании пакетов обновлений. Если вы смотрите в журналах (или используете NHProf), похоже, что пакетная обработка не работает, а последнее обновление выполняется дважды. В действительности он работает, а сообщения журнала ошибочны. Это было зафиксировано в NH3. –

+0

Спасибо за ответ. – jose

Смежные вопросы