2011-11-08 18 views
0

NHibernateの実装とLazy Loadingを使用したプロジェクトがあります。私はこのプロジェクトに3つの授業を持っています:人、アイデンティティと家族。人が一つのアイデンティティと家族のリストを持っているということです。マッピングは次のとおりです。NHibernateにおける同時実行の実装

<class name="Person" table="Person_Person" > 

    <id name="Id" type="Int64" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 

    <version name="Version" /> 

    <property name="Name" column="Name" 
       type="String(255)" update="true" insert="true" access="property" not-null="false" /> 

    <one-to-one name="Identity" property-ref="Person" 
     class="Domain.Entities.PersonIdentity,Domain.Entities" cascade="delete" fetch="select" /> 

    <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> 

私の問題は並行処理です。 Personが更新されるとPersonテーブルのバージョンフィールドが更新され、trueになりますが、 Identityが更新されると、Personテーブルのバージョンフィールドは更新されずfalseになります。 Identityの更新、データベースのPersonテーブルのバージョンフィールドが更新されないのはなぜですか?家族が追加されると は、Personテーブル内のバージョンフィールドが更新され、trueで、家族が削除されると は、Personテーブル内のバージョンフィールドが更新され、真である、しかし :

第二の問題は、ということですファミリが更新されると、Personテーブルのバージョンフィールドは更新されず、falseになります。 データベース内の個人テーブルのファミリ更新、バージョンフィールドが更新されないのはなぜですか?

答えて

1

バージョンフィールドは、エンティティ自体のプロパティ/コレクションが依存エンティティでない場合にのみ更新されるため、ファミリを追加/削除すると、Personのコレクションが変更され、ファミリを更新するとPersonがまったく変更されません。家族はその後、変更されたときに、セマンティック人が更新すべきでないことをしている場合、トランザクションでラップ

using (var tx = session.BeginTransaction()) 
{ 
    session.SaveOrUpdate(person); 
    tx.Commit(); // throws here if there is conflict in a family 
} 

アイデンティティが

<join table="PersonIdentityTable" column="PersonId"> 
    <component name="Identity"> 
    // map properties here 
    </component> 
</join> 
Person.hbm.xml

にすることができます変更したときに人のバージョンを更新します
+0

家族が常に更新されることは注目に値します。 家族だけでは更新されません。人は常に更新されますか? – Ehsan

+0

'family.Person.Version = family.Person.Version + 1;'すべてのプロパティでおそらく。私はそれについて考えなければならない – Firo

+0

ありがとう。私の問題はこのトリックで解決されました。もちろん、バージョンの新しい価値は重要ではなく、Personの1つのフィールドで重要な変更だけです。 – Ehsan

関連する問題