我有一个NHibernate实现的项目并使用Lazy Loading。 我在这个项目中有两个班:人和家庭。 这两者之间的关系是聚合,是指一个Person有一个Family列表。 映射是:
<class name="Person" table="Person_Person" >
<id name="Id" type="Int64" unsaved-value="0">
<generator class="native" />
</id>
<bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
<key column="Person_id_fk"/>
<one-to-many class="Domain.Entities.Family,Domain.Entities"/>
</bag>
</class>
在这个项目中,我通过ID获取一个人,然后更新一个家庭成员。
Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
if (fam.Name == "Jaun")
{
fam.Code = 100;
SessionInstance.Update(fam);
}
系列未更新,因为通过此消息抛出异常: `具有相同标识符值的不同对象已与会话关联:193,实体:Domain.Entities.Family
我如何更新一个人的家庭?
答案 0 :(得分:0)
尝试更新person对象而不是family对象。
Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
if (fam.Name == "Jaun")
{
fam.Code = 100;
}
SessionInstance.Update(person);
答案 1 :(得分:0)
在这种情况下,您无需致电Update
。你只需要刷新会话。在你的情况下,我会做这样的事情:
using (ITransaction transaction = SessionInstance.BeginTransaction())
{
foreach (Family fam in person.Families)
{
if (fam.Name == "Jaun")
{
fam.Code = 100;
}
}
transaction.Commit();
}
或者你可以这样做:
foreach (Family fam in person.Families)
{
if (fam.Name == "Jaun")
{
fam.Code = 100;
}
}
SessionInstance.Flush();
ISession.Update()用于更新detached
个对象。在您的情况下,对象不会分离。您应该阅读NHibernate文档中的以下两个部分,以便更好地理解这一点:
http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-insession
http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-detached