に挿入されたときに最初のレベルのキャッシュされた親オブジェクトが更新されていない私は、効果的に次のことをやっている:は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トランザクションでラップされます。
質問はこれに似ています:http://stackoverflow.com/questions/1206452/hibernate-onetomany-with-mappedby-parent-child-relationship-and-cache-problem – Alistair
なぜそれらを別々に保存していますか?親はあなたの根の集合体であり、子供の責任を負うべきです。 – Phill
Phill、これはアプリケーション全体で行われますが、テストプロジェクト(問題が存在する場所)から親または子を作成するために使用されるインフラストラクチャがあります。これは、すべて1行のメソッド呼び出しであり、新しいオブジェクトを作成し、session.Saveその上に。カスケードは私の問題を解決するために使用することができますが、テストがインフラストラクチャに行うAPIコールを複雑にし、インフラストラクチャコードに多くの変更を加えることでリレーションシップとそれらを処理する方法を理解する必要があります。基本的には、この場合はカスケードを使用しないでください。 – Alistair