删除的对象将通过级联重新保存

时间:2010-01-21 08:12:12

标签: c# nhibernate castle-activerecord linq-to-nhibernate

我拥有的是:

  • Domain.List有许多名为“SubLists”的ListToListMembership
  • Domain.List还有许多名为“ParentLists”的ListToListMembership
  • 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");
    }

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

此外,当我删除父列表或成员列表时,我希望删除成员资格但不删除成员列表(如果父项被删除),也不删除父列表(如果成员列表为删除)。

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

1 个答案:

答案 0 :(得分:1)

这个案子相当复杂,我无法全部遵循。

可能是由级联引起的。我不知道你是如何映射这些类的。

我不确定你为什么需要这个ListToListMembership课程。您可以通过简化域模型来摆脱它。数据库中仍然会有一个连接表,但这是由NH管理的。

然后我认为你试图在级联配置中加入太多逻辑。有时级联实际上是业务逻辑。如果对象的生命周期严格地耦合到另一个“父”对象,则是级联的情况。在任何更复杂的情况下,它应该作为业务逻辑的一部分来实现。 (因为对象将有自己的生命周期,需要由业务逻辑管理)