2009-05-04 5 views
0

Castle ActiveRecord/NHibernateを使用してHasAndBelongsToMany関係でカスケード削除を行うと、多くの問題が発生します。城ActiveRecordとカスケードするHasAndBelongsToMany's

多くのタグを持っている写真があります。それらは、PhotoIdとtagIdを持つPhotoHasTagというテーブルによって結合されています。写真を削除すると、関連付けられているすべてのPhotoHasTagエントリを削除し、孤立したタグも削除するようにしたいと思います。

今、私は私の写真のクラスのセットアップにこのようなものがあります:

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

そして、私のタグクラスほとんど同じ方法でセットアップです:

[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". 

これを回避するには、settカスケードするキーのルールを削除しますが、PhotoHasTagだけが削除されます。孤立したタグがある場合、それらは依然としてデータベースに残っています。

残っているタグを処理するためにトリガーを作成することを検討していますが、削除がカスケードするようにActiveRecordマッピングを設定する方法があればもっと幸せです。

いつもありがとうございました。私はずっとこれに拘束されてきたので、何かすべての助けに感謝します!

答えて

2

あなたはそうのような属性にカスケード動作を指定することができます

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

APIドキュメントは、おそらくより便利です。

関連する問題