私は 2 つのエンティティを持っています:多対多の関係で接続されていますDocument
。File
次のように動作するようにします。
- ドキュメントには多くのファイルがあります。
- ファイルは、同時に多くのドキュメントに属することができます。
- ドキュメントを削除すると、別のドキュメントに属していない限り、各ファイルも削除する必要があります。
- ドキュメントからファイルを削除すると、別のドキュメントに属していない限り、削除する必要があります。
エンティティ:
public class Document
{
public virtual int DocumentId { get; set; }
public virtual ICollection<File> Files { get; set; }
}
public class File
{
public virtual int FileId { get; set; }
public virtual ICollection<Document> DocumentsAttachedIn { get; set; }
}
マッピング:
public DocumentMap()
{
SelectBeforeUpdate();
DynamicUpdate();
Id(x => x.DocumentId).Column("DocumentId");
HasManyToMany(x => x.Files)
.AsSet()
.Cascade.AllDeleteOrphan()
.Table("DocumentFile")
.ParentKeyColumn("DocumentId")
.ChildKeyColumn("FileId");
}
public FilesMap()
{
SelectBeforeUpdate();
DynamicUpdate();
Id(f => f.FileId).Column("FileId");
HasManyToMany(f => f.DocumentsAttachedIn)
.Inverse()
.Table("DocumentFile")
.ChildKeyColumn("DocumentId")
.ParentKeyColumn("FileId");
}
の 2 つのインスタンスをDocument
、同じファイルを内部に保存しました。Document.Files からファイルを削除しようとすると、またはドキュメント全体を削除しようとすると、次の例外が発生します。
削除できませんでした: [MyNameSpace.Files.Business.File#1][SQL: DELETE FROM File WHERE FileId = ?]
内部例外:
親行を削除または更新できません: 外部キー制約が失敗しました (
my_base
.documentfile
, CONSTRAINTFKDB8FFE6221523AA6
FOREIGN KEY (FileId
) REFERENCESfile
(FileId
))
確かにそういう制約はあるし、守りたい。問題は、マッピングで明示的に伝えたときに、NHibernate がそれを削除しようとする理由です。Cascade.AllDeleteOrphan()