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

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

  • 所有实体插入,以相同的顺序使用ISession.Save()保存相应的对象
  • 所有实体更新
  • 所有集合删除
  • 所有集合元素删除,更新和插入
  • 所有集合插入
  • 所有的实体删除,以相同的顺序使用ISession.Delete()删除相应的对象
  • 为什么它会按照这个顺序被强制执行,并且有什么方法可以改变它,以便按照我给它们的顺序执行这些语句?


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

    不,你不能改变顺序。 但是,你从来没有给NHibernate任何顺序:你只是标记实体的持久性; NHibernate确定自动执行的操作。

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


    你不能改变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会尝试创建一个分配给现有员工的停车位。

    链接地址: http://www.djcxy.com/p/3983.html

    上一篇: Nhibernate order of SQL statements when flushing session

    下一篇: Elegantly handle different parameter types