刷新会话时的Nhibernate SQL语句顺序

时间:2010-12-14 19:47:06

标签: nhibernate hibernate

根据NHibernate文档,当刷新会话时,SQL语句按以下顺序发出:

  • 所有实体插入,使用ISession.Save()
  • 以相同的顺序保存相应的对象
  • 所有实体更新
  • 所有集合删除
  • 所有集合元素删除,更新和插入
  • 所有收集插入
  • 所有实体删除,按相同顺序使用ISession.Delete()删除相应的对象

为什么强制按此顺序排列,是否有任何方法可以更改它,以便语句按照我给它们的顺序执行?

2 个答案:

答案 0 :(得分:3)

这是顺序,因为它是最安全的。

不,你不能改变秩序。但是,你从来没有给NHibernate任何命令:你只是标记实体的持久性; NHibernate自动确定要做什么。

如果您认为需要对单个SQL操作进行更多控制,则可以使用IStatelessSession而不是常规ISession。你会丢失NH自动执行的所有操作(延迟加载,缓存,脏跟踪),但您可以(必须)明确说明何时InsertDeleteUpdate记录。< / p>

答案 1 :(得分:1)

根据上述内容,您无法更改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会尝试创建一个分配给现有员工的停车位。