我遇到了使用一对一关系保存实体的问题。我只想保存父实体并让孩子保存,但我必须单独保存。
这是我必须做的一个例子,否则孩子不会被保存。
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是一个身份密钥,也许这是一个问题?
答案 0 :(得分:0)
您需要在<one-to-one>
映射上启用级联才能正常运行。
类似的东西:
<one-to-one name="Child" class="Child" cascade="save-update" />
您可以阅读各种级联设置here。