2010-11-15 26 views
0

ayant un peu de mal avec un mappage pour le moment la configuration du tableau suivant:Mapping Courant: en utilisant join-table et cascades

   Shop 
      [1] [1]     
      /  \ 
      [n]  [n] 
    Category-[m]---[n]-Article 

Le comportement doit être le suivant:
1 - lors de la suppression d'un magasin, tous les articles et catégories devraient être supprimés
2 - lors de la suppression d'une catégorie, les articles connexes devraient désaffecter mais pas supprimé
3 - lors de la suppression d'un article, dans les catégories doivent désaffecter mais pas supprimé

est ici le mappage actuel:

public class ShopMap: ClassMap<Shop> 
{ 
    public ShopMap() 
    { 
     this.Table("shop"); 
     Id(x => x.Id).Column("id").GeneratedBy.Native(); 
     Map(x => x.Name).Column("name"); 

     HasMany(x => x.Categories).Cascade.AllDeleteOrphan; 
     HasMany(x => x.Articles).Cascade.AllDeleteOrphan; 
    } 
} 

public class CategoryMap: ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     this.Table("category"); 
     Id(x => x.Id).Column("id").GeneratedBy.Native(); 
     Map(x => x.Name).Column("name"); 

     References(x => x.Shop); 

     HasManyToMany(x => x.Articles).Cascade.AllDeleteOrphan() 
            .Table("article_category") 
            .ChildKeyColumn("article_id") 
            .ParentKeyColumn("category_id") 
             .Inverse(); 
    } 
} 

public class ArticleMap: ClassMap<Article> 
{ 
    public ArticleMap() 
    { 
     this.Table("article"); 
     Id(x => x.Id).Column("id").GeneratedBy.Native(); 
     Map(x => x.Name).Column("name"); 

     References(x => x.Shop); 

     HasManyToMany(x => x.Categories).Cascade.All() 
            .Table("article_category") 
            .ParentKeyColumn("article_id") 
            .ChildKeyColumn("category_id"); 
    } 
} 

Lors de la suppression d'une catégorie (Session.delete()), NH essaie de supprimer les articles connexes ainsi. Changer le mode Cascade en SaveUpdate va corriger cela, mais laissera les entrées dans le tableau des liens * article_category *. En résumé: Cascade.SaveUpdate est trop paresseux, Cascade.All est trop impatient.

J'ai essayé tout ce qui m'est venu à l'esprit dans les mappages, mais je n'ai pas trouvé de moyen correct de mapper ceci (schéma plutôt simple).

Toutes les idées sur la façon de cartographier (couramment) sont grandement appréciées!

Merci à l'avance

Sebi

Répondre

1

Les entrées sont laissés dans la table de lien, car Category.Articles est défini comme étant le côté inverse de la relation. Vous devez supprimer la catégorie de Article.Categories avant de la supprimer pour que l'enregistrement de lien soit supprimé.