2

カスケード更新/削除の問題を解決しようとして、ここで気が狂います:-)

コレクションの子エンティティを持つ親エンティティがあります。切り離された親オブジェクトの子エンティティのリストを変更したり、追加、削除したりすると、子コレクションに正しくカスケードされた更新が表示されません。

マッピング ファイル:

  <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Domain"
                   namespace="Domain">

  <class name="Parent" table="Parent" >

    <id name="Id">
      <generator class="guid.comb" />
    </id>

    <version name="LastModified"
                    unsaved-value="0"
                    column="LastModified"
                     />

    <property name="Name" type="String" length="250" />

    <bag name="ParentChildren" lazy="false" table="Parent_Children" cascade="all-delete-orphan" inverse="true">
      <key column="ParentId" on-delete="cascade" />
      <one-to-many class="ParentChildren" />
    </bag>

  </class>

  <class name="ParentChildren" table="Parent_Children">

    <id name="Id">
      <generator class="guid.comb" />
    </id>

    <version name="LastModified"
                    unsaved-value="0"
                    column="LastModified"
                     />

    <many-to-one
   name="Parent"
   class="Parent"
   column="ParentId"
   lazy="false"
   not-null="true"
       />
  </class>
</hibernate-mapping>

テスト

    [Test]
    public void Test()
    {
        Guid id;
        int lastModified;
        // add a child into 1st session then detach
        using(ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession())
        {
            Console.Out.WriteLine("Selecting...");
            Parent parent =  (Parent) session.Get(typeof (Parent), new Guid("4bef7acb-bdae-4dd0-ba1e-9c7500f29d47"));

            id = parent.Id;
            lastModified = parent.LastModified + 1; // ensure the detached version used later is equal to the persisted version

            Console.Out.WriteLine("Adding Child...");
            Child child = (from c in session.Linq<Child>() select c).First();
            parent.AddChild(child, 0m);

            session.Flush();
            session.Dispose(); // not needed i know
        }

        // attach a parent, then save with no Children
        using (ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession())
        {
            Parent parent = new Parent("Test");              

            parent.Id = id; 
            parent.LastModified = lastModified; 

            session.Update(parent);
            session.Flush();
        }
    }

コレクションに子がないように製品が更新されたという事実を想定しています-子はParent_Childテーブルで削除されます。問題は、製品を新しいセッションに接続することに関係しているようですか? カスケードが all-delete-orphan に設定されているため、コレクションへの変更が関連するエンティティ/テーブルに反映されると思いますか? この場合は削除しますか?

ここで何が欠けていますか?

4

1 に答える 1

2

私は同様の問題に苦労してきました。私の解決策があなたの問題に適合するかどうかはわかりませんが、ISession.Update の代わりに ISession.Merge を使用してみてください。

于 2009-09-09T08:06:30.240 に答える