2010-12-14 3 views
7

Согласно NHibernate документации, заявления SQL выпускаются в следующем порядке, когда сеанс продувают:Nhibernate порядок операторов SQL при промывке сессии

  • все вставки сущности, в том же порядке соответствующие объекты были сохранены с помощью ISession.Save()
  • все предприятие обновляет
  • все делеции коллекции
  • все коллекции элементов делеции, обновления и вставки
  • все коллекции insertio нс
  • все объектные делеции, в том же порядке соответствующие объекты были удалены с помощью ISession.Delete()

Почему вынужден в таком порядке, и есть ли способ изменить его так, что операторы выполняются в том же порядке, что я им даю?

+0

Я заинтригован этим. Почему вы хотите другой порядок, чего вы пытаетесь достичь? – Rippo

+0

Хорошо, не вдаваясь в подробности, у меня есть много-много таблиц (с составным pk), которые я пытаюсь удалить сначала, а затем повторно вставлять при сохранении родителя; Я установил inverse = true в родительскую коллекцию, поэтому мне нужно управлять сохранением самостоятельно, но поскольку вставки происходят до удаления, я получаю нарушение ограничений, если мне нужно переустановить старую много-много. Я играю с NH всего один день, все еще пытаюсь разобраться в деталях. – LMC

ответ

3

Это в том порядке, потому что это самый безопасный.

И нет, вы не можете изменить заказ. Но также вы никогда не давали NHibernate никакого распоряжения: вы просто отмечаете сущности для настойчивости; NHibernate определяет, что делать автоматически.

Если вы считаете, что вам нужно больше контролировать отдельные операции SQL, вы можете использовать IStatelessSession вместо обычного ISession. Вы теряете все вещи, которые NH делает автоматически (ленивая загрузка, кеширование, грязное отслеживание), но вы можете (должны) сказать явно, когда Insert, Delete или Update запись.

+0

Хорошо спасибо Диего, это имеет смысл тогда. – LMC

+0

Это, наверное, самый безопасный, но вам нужно помнить об этом на каждом шагу, как это делается, и даже, как правило, простая вставка delete-> становится сложной. (Для записей с уникальным свойством/column s.Delete; s.Save не будет работать). – mayu

0

Вы не можете изменить порядок, в котором NHibernate генерирует SQL в соответствии с приведенным выше, но вы можете разбить единицы работы.

например:

using(var transaction = Session.BeginTransaction()) 
{ 
    var company = Session.QueryOver<Company>().First(); 
    var employee = new Employee{ ID = Guid.NewID() }; 
    company.Employees.Add(employee); 
    Session.Flush();  

    var carSpace = new CarParkingSpace { EmployeeID = employee.ID }; 
    Session.Save(carSpace); 

    transaction.Commit(); 
} 

Добавляя Session.Flush() - все, что к этому моменту будет выталкиваться к сделке. Без этого NHibernate попытается создать парковочное место, выделенное еще не существующему сотруднику.

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