2010-01-21 4 views
1

는 내가 가지고있는 것은 이것이다 :삭제 된 개체가 계단식으로 다시 저장됩니다

  • Domain.List는 "하위 목록"
  • Domain.List이 많은 ListToListMemberships 호출했다
  • "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"); 
    } 

을하고 그것에 멤버와 그룹 구성원을 추가, 내가 만들 수 회원과 회원을 원한다 자동으로

또한 부모 목록이나 회원 목록을 삭제할 때 회원 목록은 삭제되지만 부모 목록의 경우 삭제되지 않으며 부모 목록의 경우 삭제되지 않습니다 (회원 목록의 경우 삭제됨).

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에 따라 특정 속성 값을 가지기 때문입니다. 이는 표시 될 때의 멤버입니다. 이 문제는 확실히 계단식 논쟁이며, 그 이유는 학부모 또는 자녀가 삭제되면 더 이상 회원 자격이 필요하다는 것입니다. –

관련 문제