1

我有两个实体: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");
}

我保存了两个实例Document,其中包含相同的文件。当我尝试从 Document.Files 中删除文件或删除整个 Document 时,出现以下异常:

无法删除:[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 回答