2010-01-21 13 views
1

Ce que j'est ceci:objet supprimé serait réenregistrés par cascade

  • Domain.List a beaucoup ListToListMemberships appelés "sous-listes"
  • Domain.List a aussi beaucoup ListToListMemberships appelé "ParentLists"
  • ListToListMembership a une liste (le parent).
  • ListToListMembership a une autre liste (le membre).

Donné ce que je veux le test suivant pour passer:

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

Fondamentalement, quand je crée une liste et ajouter une adhésion de liste avec un membre à, je veux les membres et le membre à créer automatiquement. De plus, lorsque je supprime la liste des parents ou la liste des membres, je souhaite supprimer l'adhésion, mais pas la liste des membres (dans le cas du parent supprimé) ni la liste des parents (dans le cas de la liste des membres en cours de suppression).

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

Répondre

1

Cette affaire est assez complexe et je ne peux pas suivre tout cela. Ce qui arrive est probablement causé par des cascades. Je ne sais pas comment tu as cartographié les cours.

Je ne sais pas pourquoi vous avez besoin de cette classe ListToListMembership. Vous pouvez probablement vous en débarrasser en simplifiant le modèle de domaine. Il y aura toujours une table de connexion dans la base de données, mais celle-ci est gérée par NH. Puis je pense que vous essayez de mettre trop de logique dans la configuration en cascade. Parfois, la cascade est en fait une logique métier. Si le cycle de vie d'un objet est strictement couplé à un autre objet "parent", c'est un cas pour les cascades. Dans tous les cas plus complexes, il devrait être mis en œuvre dans le cadre de la logique métier. (Parce que les objets auront leur propre cycle de vie qui doit être géré par la logique métier)

+0

Merci. La raison pour laquelle j'ai la classe d'appartenance est parce qu'une Domain.List aura des valeurs de propriété spécifiques selon le Domain.List c'est un membre de quand il est affiché. Le problème est certainement en cascade et la raison en est que si le parent ou l'enfant est supprimé, je sais que plus besoin de leurs adhésions. –