1

我有一个 NHibernate 实现并使用延迟加载的项目。我在这个项目中有两个课程: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

我怎样才能更新一个人的家庭?

4

2 回答 2

0

尝试更新人对象而不是家庭对象。

Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
    if (fam.Name == "Jaun")
        {
        fam.Code = 100;
        }
SessionInstance.Update(person);
于 2011-11-01T04:19:31.160 回答
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 文档中的以下 2 部分以更好地理解这一点:

http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-insession
http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-updating-detached

于 2011-11-01T12:21:43.153 回答