NHibernate多对多全删除孤儿

时间:2016-02-17 01:33:10

标签: c# nhibernate fluent-nhibernate many-to-many all-delete-orphan

我有两个实体:DocumentFile以多对多关系连接。 我希望他们的行为如下:

  1. 文档包含许多文件。
  2. 文件可以同时属于多个文档。
  3. 当我删除文档时,每个文件也应该被删除,除非它属于另一个文档。
  4. 当我从文档中删除某个文件时,应将其删除,除非它属于另一个文档。
  5. 实体:

    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中删除文件时,或者当我删除整个文档时,我得到以下异常:

      

    无法删除:[MyNameSpace.Files.Business.File#1] [SQL:DELETE FROM   文件WHERE FileId =?]

    内部例外:

      

    无法删除或更新父行:外键约束失败(my_basedocumentfile,CONSTRAINT FKDB8FFE6221523AA6 FOREIGN KEY(FileId)参考fileFileId))

    确实,我有这样的约束,我想保留它。问题是为什么NHibernate试图删除它,当我在映射中明确告知:Cascade.AllDeleteOrphan()

1 个答案:

答案 0 :(得分:1)

这些解决方案:

  
      
  1. 当我删除文档时,每个文件也应该被删除,除非它属于另一个文档。
  2.   
  3. 当我从文档中删除某个文件时,应将其删除,除非它属于另一个文档。
  4.   

是:在业务层自行解决。 NHibernate级联在这里不起作用。它是在全范围(如果打开)或否(如果关闭)进行级联。

之间没什么