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, или когда я удаляю весь документ, я получаю следующее исключение:
не удалось удалить: [MyNameSpace.Files.Business.File#1][SQL: УДАЛИТЬ ИЗ ФАЙЛА, ГДЕ FileId =?]
Внутреннее исключение:
Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (
my_base
,documentfile
, ОГРАНИЧЕНИЕFKDB8FFE6221523AA6
ИНОСТРАННЫЙ КЛЮЧ (FileId
) РЕКОМЕНДАЦИИfile
(FileId
))
Действительно, у меня есть такое ограничение, и я хочу его сохранить. Вопрос в том, почему NHibernate пытается удалить его, когда я явно сказал в отображениях: Cascade.AllDeleteOrphan()
1 ответ
Решение этих:
- Когда я удаляю документ, каждый файл также должен быть удален, если только он не принадлежит другому документу.
- Когда я удаляю какой-либо файл из документа, он должен быть удален, если он не принадлежит другому документу.
это: решить это самостоятельно на бизнес-уровне. NHibernate каскад не будет работать здесь. Это делается каскадом в полном диапазоне (если он включен) или нет (если он выключен). Ничего между