1

我所拥有的是:

  • Domain.List 有许多名为“SubLists”的 ListToListMemberships
  • Domain.List 也有许多名为“ParentLists”的 ListToListMemberships
  • ListToListMembership 有一个 List(父级)。
  • ListToListMembership 有另一个 List(成员)。

鉴于此,我希望通过以下测试:

    [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");
    }

基本上,当我创建一个列表并向其中添加一个成员的列表成员资格时,我希望自动创建成员资格和成员。

另外,当我删除父列表或成员列表时,我希望删除成员资格,但不希望删除成员列表(在删除父列表的情况下)或删除父列表(在删除成员列表的情况下)。

域列表:

    <!-- 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;
    }

列表到列表成员:

    <!-- 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 回答