NHibernate 多对多全删除孤儿
NHibernate Many-To-Many all-delete-orphans
我有两个实体: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 中删除文件或删除整个文档时,出现以下异常:
could not delete: [MyNameSpace.Files.Business.File#1][SQL: DELETE FROM
File WHERE FileId = ?]
内部异常:
Cannot delete or update a parent row: a foreign key constraint fails (my_base
.documentfile
, CONSTRAINT FKDB8FFE6221523AA6
FOREIGN KEY (FileId
) REFERENCES file
(FileId
))
确实,我有这样的约束,我想保留它。问题是当我在映射中明确告知时,为什么 NHibernate 会尝试删除它:Cascade.AllDeleteOrphan()
这些的解决方法:
- When I delete document, each file should be deleted as well, unless it belongs to another document.
- When I delete some file from document, it should be deleted, unless it belongs to another document.
是:业务层自己解决。 NHibernate 级联在这里不起作用。它可以在全范围内进行级联(如果打开)或不进行级联(如果关闭)。
之间没有
我有两个实体: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 中删除文件或删除整个文档时,出现以下异常:
could not delete: [MyNameSpace.Files.Business.File#1][SQL: DELETE FROM File WHERE FileId = ?]
内部异常:
Cannot delete or update a parent row: a foreign key constraint fails (
my_base
.documentfile
, CONSTRAINTFKDB8FFE6221523AA6
FOREIGN KEY (FileId
) REFERENCESfile
(FileId
))
确实,我有这样的约束,我想保留它。问题是当我在映射中明确告知时,为什么 NHibernate 会尝试删除它:Cascade.AllDeleteOrphan()
这些的解决方法:
- When I delete document, each file should be deleted as well, unless it belongs to another document.
- When I delete some file from document, it should be deleted, unless it belongs to another document.
是:业务层自己解决。 NHibernate 级联在这里不起作用。它可以在全范围内进行级联(如果打开)或不进行级联(如果关闭)。
之间没有