Удаленный объект будет повторно сохранен каскадом - PullRequest
1 голос
/ 21 января 2010

У меня есть следующее:

  • Domain.List имеет много списков ListToListMemberships под названием «SubLists»
  • Domain.List также имеет много списков ListToListMemberships под названием «ParentLists»
  • ListToListMembership имеет один список (родитель).
  • 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;
    }

Список участников:

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

1 Ответ

1 голос
/ 21 января 2010

Этот случай довольно сложный, и я не могу следить за всем этим.

То, что происходит, вероятно, вызвано каскадами. Я не знаю, как вы составили карту классов.

Я не уверен, зачем вам этот класс ListToListMembership. Вы, вероятно, можете избавиться от этого, упростив модель предметной области. В базе данных все еще будет таблица соединений, но она управляется NH.

Тогда я думаю, что вы пытаетесь поместить слишком много логики в каскадную конфигурацию. Иногда каскадирование на самом деле является бизнес-логикой. Если жизненный цикл объекта строго связан с другим «родительским» объектом, это касается каскадов. В любом более сложном случае это должно быть реализовано как часть бизнес-логики. (Потому что у объектов будет свой жизненный цикл, который должен управляться бизнес-логикой)

...