2009-05-04 6 views
0

J'ai beaucoup de problèmes en cascade des suppressions grâce à une relation HasAndBelongsToMany en utilisant Castle ActiveRecord/NHibernate.Cascading avec Castle ActiveRecord HasAndBelongsToMany's

J'ai des photos qui ont et appartiennent à de nombreux Tags. Ils sont rejoints par une table appelée PhotoHasTag qui a juste un photoId et tagId. Lorsque je supprime une photo, je souhaite que toutes les entrées PhotoHasTag associées soient supprimées et que toutes les étiquettes orphelines soient également supprimées.

En ce moment, j'ai ma place quelque chose de classe photo comme ceci:

[ActiveRecord(Table="Photo")] 
    public class Photo 
    { 
     [PrimaryKey(Column = "photoId", Generator = Castle.ActiveRecord.PrimaryKeyType.Identity)] 
     public virtual int Id { get; set; }  

     [HasAndBelongsToMany(Table="PhotoHasTag",ColumnKey="photoId",ColumnRef="tagId",Lazy=true,Cascade=ManyRelationCascadeEnum.AllDeleteOrphan)] 
     public virtual IList<Tag> Tags { get; set; } 
    } 

Et ma classe Tag est la configuration à peu près de la même façon:

[ActiveRecord(Table="Tag")] 
    public class Photo 
    { 
     [PrimaryKey(Column = "tagId", Generator = Castle.ActiveRecord.PrimaryKeyType.Identity)] 
     public virtual int Id { get; set; } 

     [HasAndBelongsToMany(Table = "PhotoHasTag", ColumnKey = "tagId", ColumnRef = "photoId", Lazy = true)] 
     public IList<Photo> Photos { get; set; } 
    } 

Lorsque je tente d'enlever photo de I fin jusqu'à obtenir une erreur de SQL Server:

The DELETE statement conflicted with the REFERENCE constraint "PhotoHasTag_FK1". 

Je peux contourner cela dans SQL Server par sett en effaçant la règle de suppression sur la clé à cascade, mais seulement le PhotoHasTag est supprimé. S'il y a des balises orphelines, elles resteront dans la base de données. J'envisage d'écrire un Trigger pour prendre en charge les Tags restants, mais je serais beaucoup plus heureux s'il y avait un moyen de configurer mes mappages ActiveRecord pour que la suppression se fasse en cascade.

Merci d'avance, j'ai été bloqué pour toujours et j'apprécie toute l'aide!

Répondre

2

Vous pouvez spécifier le comportement en cascade dans les attributs comme ceci:

[HasAndBelongsToMany(Table = "PhotoHasTag", Cascade=ManyRelationCascadeEnum.AllDeleteOrphan, ColumnKey = "tagId", ColumnRef = "photoId", Lazy = true)] 
public IList<Photo> Photos { get; set; } 

La documentation API est probablement plus utile.

Questions connexes