Nhibernate порядок операторов SQL при очистке сессии - PullRequest
7 голосов
/ 14 декабря 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 14 декабря 2010

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

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

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

1 голос
/ 13 октября 2015

Вы не можете изменить порядок, в котором 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();
}

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

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