NHibernate:如何选择有独生子女的父母(知道childID)?

NHibernate:如何选择有独生子女的父母(知道childID)?,nhibernate,select,Nhibernate,Select,我想将子对象添加到父对象。我在哪一点上知道孩子的新身份?我可以在DB insert之前访问它吗?我的ID生成器是HILO。我询问的原因是父对象的副本需要传播到另一个应用程序。知道这一点可能会节省我去DB的时间,只是为了发现新插入的孩子的ID是什么,因为我已经有了所有其他可用的信息 如果1)无法通过往返数据库完成,那么(插入后)如何选择仅带子级的父级?父母可能有多个孩子,但我只对只有那个孩子的父母感兴趣。这对我来说不太管用: parent=session.QueryOver() .List() .

我想将子对象添加到父对象。我在哪一点上知道孩子的新身份?我可以在DB insert之前访问它吗?我的ID生成器是HILO。我询问的原因是父对象的副本需要传播到另一个应用程序。知道这一点可能会节省我去DB的时间,只是为了发现新插入的孩子的ID是什么,因为我已经有了所有其他可用的信息

  • 如果1)无法通过往返数据库完成,那么(插入后)如何选择仅带子级的父级?父母可能有多个孩子,但我只对只有那个孩子的父母感兴趣。这对我来说不太管用:

    parent=session.QueryOver() .List() .Where(p=>p.Children.Select(c=>c.Id==ChildId.First()).First()

  • 我想要的SQL等价物是:

    select Parent.Id, Children.* From Parent
        join Children on Parent.Id = Children.ParentId
        where ChildId = 1540096
    
    Session.Save(您的对象)
    上,将为您的对象填充ID。但是,这不会导致立即插入数据库。实际插入将在会话刷新(Transaction.Commit等)时进行

    除此之外,使用当前的方法,您可能会传播一个可能不会映射到现有对象的Id。例如,假设您在插入之前传播了一个Id,然后由于任何原因插入失败。我们将如何处理这种不一致的状态?小心这个案例和类似的案例


    我给您的建议是不要传播可能无效的状态。

    感谢您对ID问题的解释。我现在明白了。您还指出了有效的潜在问题。我在
    会话后立即提交。Save(MyObject)
    ,所以我冒了一个险,但这是一个很小的险。另一种选择是再次反对DB,以检索提交的记录并确保。当我这样做的时候,我会遇到每个父母都有多个孩子的问题,我想要的只是那个孩子和它的父母(如Q#2所述)。谢谢你在这方面的帮助!一旦点击save and commit,就不需要转到数据库。如果事务成功,则对象中的ID与数据库中的ID相同。不用再去拿了。我是不是遗漏了什么?