1

私が持っているのはこれです:

  • Domain.List には、「SubLists」と呼ばれる多くの ListToListMemberships があります。
  • Domain.List には、「ParentLists」と呼ばれる多くの ListToListMemberships もあります。
  • ListToListMembership には 1 つのリスト (親) があります。
  • ListToListMembership には別のリスト (メンバー) があります。

これを考えると、次のテストに合格する必要があります。

    [Test]
    public void WhenDeletingChildMembershipShouldBeDeletedButNotParent()
    {
        var list = new Domain.List();
        var child = new Domain.List();

        var membership = new ListToListMembership()
        {
            Member = child,
        };

        list.SubLists.Add(membership);
        Session.Save(list);
        Session.Flush();
        Session.Evict(list);
        Session.Evict(child);

        var childFromDb = Session.Linq<Domain.List>()
            .FirstOrDefault(l => l.ID == child.ID);

        Assert.IsNotNull(childFromDb, "child wasn't saved when the parent was saved");
        Assert.AreNotSame(child, childFromDb, "child was pulled from cache not the db");

        //This will allow it to pass, but I don't want to have to do this.
        //  foreach (var m in childFromDb.ParentLists)
        //  {
        //      m.List.SubLists.Remove(m);
        //      Session.Save(m.List);
        //  }

        Session.Delete(childFromDb);
        Session.Flush();
        Session.Evict(childFromDb);

        var membershipFromDb = Session.Linq<ListToListMembership>()
            .FirstOrDefault(m => m.ID == membership.ID);

        Assert.IsNull(membershipFromDb, "membership wasn't deleted");

        var parentFromDb = Session.Linq<Domain.List>()
            .FirstOrDefault(l => l.ID == list.ID);

        Assert.IsNotNull(parentFromDb, "parent list was deleted");
    }

基本的に、リストを作成し、それにメンバーを含むリスト メンバーシップを追加すると、メンバーシップとメンバーが自動的に作成されます。

また、親リストまたはメンバー リストのいずれかを削除する場合、メンバー リスト (親が削除された場合) も親リスト (メンバー リストが削除された場合) も削除せずに、メンバーシップを削除したいと考えています。

Domain.List:

    <!-- Other relevant fields -->

    [HasMany(typeof(ListToListMembership),ColumnKey="ListId",
        Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]
    public IList<ListToListMembership> SubLists{
        get;
        set;
    }
    [HasMany(typeof(ListToListMembership),ColumnKey="MemberId",
        Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]
    public IList<ListToListMembership> ParentLists {
        get;
        set;
    }

ListToListMembership:

    <!-- other relevant fields -->
    [BelongsTo("ListId",Cascade=CascadeEnum.SaveUpdate)]
    public List List {
        get;
        set;
    }
    [BelongsTo("MemberId", Cascade = CascadeEnum.SaveUpdate)]
    public List Member {
        get;
        set;
    }
4

1 に答える 1

1

この事件はかなり複雑で、すべてを追うことはできません。

何が起こるかは、おそらくカスケードによって引き起こされます。クラスをどのようにマッピングしたかわかりません。

ListToListMembershipなぜこのクラスが必要なのかわかりません。ドメイン モデルを単純化することで、おそらくそれを取り除くことができます。データベースには接続テーブルが残りますが、これは NH によって管理されます。

それから、カスケード構成にあまりにも多くのロジックを入れようとしていると思います。カスケードが実際にはビジネス ロジックである場合もあります。オブジェクトのライフサイクルが別の「親」オブジェクトに厳密に結合されている場合は、カスケードのケースです。より複雑なケースでは、ビジネス ロジックの一部として実装する必要があります。(オブジェクトには、ビジネス ロジックで管理する必要がある独自のライフ サイクルがあるため)

于 2010-01-21T08:22:29.550 に答える