1

私は 2 つのエンティティを持っています:多対多の関係で接続されていますDocumentFile次のように動作するようにします。

  1. ドキュメントには多くのファイルがあります。
  2. ファイルは、同時に多くのドキュメントに属することができます。
  3. ドキュメントを削除すると、別のドキュメントに属していない限り、各ファイルも削除する必要があります。
  4. ドキュメントからファイルを削除すると、別のドキュメントに属していない限り、削除する必要があります。

エンティティ:

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, CONSTRAINT FKDB8FFE6221523AA6FOREIGN KEY ( FileId) REFERENCES file( FileId))

確かにそういう制約はあるし、守りたい。問題は、マッピングで明示的に伝えたときに、NHibernate がそれを削除しようとする理由です。Cascade.AllDeleteOrphan()

4

1 に答える 1

1

これらの解決策:

  1. ドキュメントを削除すると、別のドキュメントに属していない限り、各ファイルも削除する必要があります。
  2. ドキュメントからファイルを削除すると、別のドキュメントに属していない限り、削除する必要があります。

は:ビジネスレイヤーで自分で解決してください。NHibernate カスケードはここでは機能しません。フル レンジでカスケードを実行するか (オンの場合)、しないか (オフの場合) があります。間に何もない

于 2016-02-17T05:57:50.480 に答える