与城堡ActiveRecord HasAndBelongsToMany的级联

时间:2009-05-04 01:58:54

标签: c# nhibernate castle-activerecord

使用Castle ActiveRecord / NHibernate通过HasAndBelongsToMany关系级联删除时遇到很多麻烦。

我有照片,它们属于许多标签。它们由一个名为PhotoHasTag的表连接,该表只有一个photoId和tagId。当我删除照片时,我希望删除所有相关的PhotoHasTag条目,并删除任何孤立的标签。

现在我的Photo类设置如下:

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

我的Tag类设置方式几乎相同:

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

当我尝试删除照片时,我最终从SQL Server收到错误:

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

我可以通过在Cascade键上设置删除规则来在SQL Server中徘徊,但只删除了PhotoHasTag。如果有任何孤立的标签,它们仍将在数据库中挥之不去。

我正在考虑编写一个Trigger来处理剩余的标签,但如果有办法设置我的ActiveRecord映射以便删除级联,我会更高兴。

在此先感谢,我一直坚持这一点,所以我感谢所有人的帮助!

1 个答案:

答案 0 :(得分:2)

您可以在属性中指定级联行为,如下所示:

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

API文档可能更有帮助。