2012-01-27 5 views
0

に挿入されたときに最初のレベルのキャッシュされた親オブジェクトが更新されていない私は、効果的に次のことをやっている:はNHibernateは:子供が

session.Save(newParent); 

newChild = new Child(parent: newParent); 

session.Save(newChild); 

session.Load<Parent>(newParent.Id).Children.Count //0 - calling Get has the same result 

しかし、ロード呼び出しの前に、私は(新規の親)session.Refreshを呼び出す場合、子供たちは正しくロードされます。したがって、子がある前に親を明示的にキャッシュしておき、追加されたときに新しい子でキャッシュを更新しないようにします。

親のマッピング:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="MyApp.Models.Entities.Parent,MyApp" table="[Parent]" lazy="true" batch-size="100"> 
    <id name="ParentId" column="ParentId" type="int"> 
     <generator class="native" /> 
    </id> 
    <bag name="Children" inverse="true" lazy="true" cascade="delete" batch-size="100"> 
     <key column="ParentId" /> 
     <one-to-many class="MyApp.Models.Entities.Child,MyApp" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

子供マッピング:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="MyApp.Models.Entities.Child,MyApp" table="[Child]" lazy="true" batch-size="100"> 
    <id name="ChildId" column="ChildId" type="int"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="Parent" column="ParentId" cascade="save-update" /> 
    </class> 
</hibernate-mapping> 

私の質問は、1)私が何か間違ったことをやっている場合、またはこれがデフォルトの動作ですか? 2)そうでない場合、これを解決する最もクリーンな方法は何ですか?

この問題は実際にはテストプロジェクトでのみ発生し、この場合はバックグラウンドで強制的にリフレッシュするための基礎となるテストアーキテクチャを変更できますが、実装前に何が起こっているのか十分に理解したいと思います。

NHibernate 3.2を使用し、すべてがReadCommittedトランザクションでラップされます。

+0

質問はこれに似ています:http://stackoverflow.com/questions/1206452/hibernate-onetomany-with-mappedby-parent-child-relationship-and-cache-problem – Alistair

+1

なぜそれらを別々に保存していますか?親はあなたの根の集合体であり、子供の責任を負うべきです。 – Phill

+0

Phill、これはアプリケーション全体で行われますが、テストプロジェクト(問題が存在する場所)から親または子を作成するために使用されるインフラストラクチャがあります。これは、すべて1行のメソッド呼び出しであり、新しいオブジェクトを作成し、session.Saveその上に。カスケードは私の問題を解決するために使用することができますが、テストがインフラストラクチャに行うAPIコールを複雑にし、インフラストラクチャコードに多くの変更を加えることでリレーションシップとそれらを処理する方法を理解する必要があります。基本的には、この場合はカスケードを使用しないでください。 – Alistair

答えて

0

1)私は何か間違っているのですか、これはデフォルトの動作ですか?

これを処理する正しい方法は、それらを一度に追加してカスケードを使用することです。しかし、これは私の特定の状況には適切ではありません。

2)そうでない場合、これを解決する最もクリーンな方法は何ですか?

これを解決するための特別な方法はありません。私は、キャッシュ内の親をテスト・アーキテクチャーにリフレッシュして焼いた。

Thanks Jamie and Phill。

2

ここで、子の子コレクションに子を追加していますか? newChild.ParentからnewParentへの参照を設定してもnewChildをChildrenPolicyコレクションに追加することはできません。そのため、コレクションをプライベートメンバー(アクセス戦略を使用してマップされたもの)として宣言し、両者の関係を維持するAddChildメソッドとRemoveChildメソッドを記述するのが一般的な理由です。

+0

どこでも。私は、NHibernateが子が追加され、キャッシュされた親をリフレッシュする必要があることを認識することを望んでいました/新しい子を子リストに追加する必要がありました。これを手動で更新する必要があるようです – Alistair