1

NHibernateの実装とLazyLoadingを使用したプロジェクトがあります。このプロジェクトには、人と家族の2つのクラスがあります。これら2つの関係は集約であり、人が家族のリストを持っていることを意味します。マッピングは:

  <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 に答える