NHibernate многие-ко-многим все-удалить-сирот

У меня есть две сущности: Document а также File связаны в отношениях "многие ко многим". Я хочу, чтобы они вели себя следующим образом:

  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, или когда я удаляю весь документ, я получаю следующее исключение:

не удалось удалить: [MyNameSpace.Files.Business.File#1][SQL: УДАЛИТЬ ИЗ ФАЙЛА, ГДЕ FileId =?]

Внутреннее исключение:

Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется (my_base,documentfile, ОГРАНИЧЕНИЕ FKDB8FFE6221523AA6 ИНОСТРАННЫЙ КЛЮЧ (FileId) РЕКОМЕНДАЦИИ file (FileId))

Действительно, у меня есть такое ограничение, и я хочу его сохранить. Вопрос в том, почему NHibernate пытается удалить его, когда я явно сказал в отображениях: Cascade.AllDeleteOrphan()

1 ответ

Решение

Решение этих:

  1. Когда я удаляю документ, каждый файл также должен быть удален, если только он не принадлежит другому документу.
  2. Когда я удаляю какой-либо файл из документа, он должен быть удален, если он не принадлежит другому документу.

это: решить это самостоятельно на бизнес-уровне. NHibernate каскад не будет работать здесь. Это делается каскадом в полном диапазоне (если он включен) или нет (если он выключен). Ничего между

Другие вопросы по тегам