NHibernate一对一关系无法正确保存

时间:2010-09-09 15:48:49

标签: nhibernate nhibernate-mapping

我遇到了使用一对一关系保存实体的问题。我只想保存父实体并让孩子保存,但我必须单独保存。

这是我必须做的一个例子,否则孩子不会被保存。

 var session = SessionProvider.OpenSession.Session;
            using (var tx = session.BeginTransaction())
            {
                try
                {
                    session.SaveOrUpdate(parent);
                        if (parent.Child.IsPersisted)
                        {
                            session.Update(parent.Child);
                        }
                        else
                        {      
                            session.Save(parent.Child);
                        }
                    }
}


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" assembly="xxx">
  <class name="Parent" polymorphism="explicit" table="Parent">
    <id name="Id" column="JointID" type="int">
      <generator class="native" />
    </id>
    <one-to-one name="Child" class="Child" />
  </class>
</hibernate-mapping>


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"
                   assembly="xxx">
  <class name="Child" xmlns="urn:nhibernate-mapping-2.2" polymorphism="explicit" table="Child">
    <id name="Id" column="JointID" type="int" unsaved-value="0">
      <generator class="native" />
    </id>
    <many-to-one name="Parent" column="JointID" insert="false" update="false" />
  </class>
</hibernate-mapping>

关于如何在不进行两次保存调用的情况下保存它的任何想法?

当我按照下面的建议将关系设置为级联时,我得到外键约束错误。如果我用NHProf分析查询,它会尝试在insert语句中使用临时id(-1)作为JointId,而不是新创建的父id。 Parent表中的JointId是一个身份密钥,也许这是一个问题?

1 个答案:

答案 0 :(得分:0)

您需要在<one-to-one>映射上启用级联才能正常运行。

类似的东西:

<one-to-one name="Child" class="Child" cascade="save-update" /> 

您可以阅读各种级联设置here