我有两个实体: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");
}
我保存了Document
的两个实例,里面有相同的文件。
当我尝试从Document.Files中删除文件时,或者当我删除整个文档时,我得到以下异常:
无法删除:[MyNameSpace.Files.Business.File#1] [SQL:DELETE FROM 文件WHERE FileId =?]
内部例外:
无法删除或更新父行:外键约束失败(
my_base
。documentfile
,CONSTRAINTFKDB8FFE6221523AA6
FOREIGN KEY(FileId
)参考file
(FileId
))
确实,我有这样的约束,我想保留它。问题是为什么NHibernate试图删除它,当我在映射中明确告知:Cascade.AllDeleteOrphan()
答案 0 :(得分:1)
这些解决方案:
- 当我删除文档时,每个文件也应该被删除,除非它属于另一个文档。
- 当我从文档中删除某个文件时,应将其删除,除非它属于另一个文档。
醇>
是:在业务层自行解决。 NHibernate级联在这里不起作用。它是在全范围(如果打开)或否(如果关闭)进行级联。
之间没什么