2010-01-21 2 views
1

Что у меня есть это:удаленный объект будет повторно сохранен каскадом

  • Domain.List имеет много ListToListMemberships называемых «подсписков»
  • 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; 
    } 

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

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

Что происходит, вероятно, вызвано каскадами. Я не знаю, как вы отображали классы.

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

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

+0

Спасибо. Причина, по которой у меня есть класс членства, заключается в том, что Domain.List будет иметь определенные значения свойств в зависимости от Domain.List, который является членом, когда он отображается. Проблема, безусловно, является каскадной, и причина в том, что если родитель или ребенок удаляются, я знаю, что им больше нужно их членство. –

Смежные вопросы