Auto-referência fluente do NHibernate muitos a muitos

Eu tenho uma entidade chamada Livros que pode ter uma lista de mais livros chamados RelatedBooks.

A entidade abreviada do Livro parece algo como isto:

public class Book
{
      public virtual long Id { get; private set; }

      public virtual IList<Book> RelatedBooks { get; set; }
}

Aqui está a aparência do mapeamento para esse relacionamento

HasManyToMany(x => x.RelatedBooks)
                .ParentKeyColumn("BookId")
                .ChildKeyColumn("RelatedBookId")
                .Table("RelatedBooks")
                .Cascade.SaveUpdate();

Aqui está uma amostra dos dados que são gerados na tabela RelatedBooks:

BookId     RelatedBookId
1          2
1          3

O problema ocorre quando tento excluir um livro. Se eu excluir o livro que possui um ID 1, tudo funcionará bem e a tabela RelatedBooks terá os dois registros correspondentes removidos. No entanto, se eu tentar excluir o livro com um ID 3, recebo o erro "A instrução DELETE entrou em conflito com a restrição REFERENCE" FK5B54405174BAB605 ". O conflito ocorreu no banco de dados" Teste ", tabela" dbo.RelatedBooks ", coluna 'RelatedBookId '".

Basicamente, o que está acontecendo é que o Livro não pode ser excluído porque o registro na tabela RelatedBooks que possui um RelatedBookId igual a 3 nunca é excluído.

Como faço para excluir esse registro quando excluo um livro?

EDITAR

Depois de alterar o Cascade de SaveUpdate () para All (), o mesmo problema ainda existe se eu tentar excluir o livro com um ID igual a 3. Também com o Cascade definido como All (), se excluir o livro com e ID igual a 1, todos os três livros (IDs: 1, 2 e 3) são excluídos para que também não funcionem.

Olhando para o SQL que é executado quando o método Book.Delete () é chamado quando eu excluo o Livro com um ID 3, parece que a instrução SELECT está olhando para a coluna errada (o que eu assumo significa que a declaração SQL DELETE cometeria o mesmo erro, portanto nunca remover esse registro). Aqui está o SQL para o RelatedBook

SELECT relatedboo0_.BookId as BookId3_
       , relatedboo0_.RelatedBookId as RelatedB2_3_ 
       , book1_.Id as Id14_0_ 

FROM RelatedBooks relatedboo0_ 
     left outer join [Book] book1_ on relatedboo0_.RelatedBookId=book1_.Id 

WHERE relatedboo0_.BookId=3

A declaração WHERE deve se parecer com isso para o caso específico:

WHERE relatedboo0_.RelatedBookId = 3

SOLUÇÃO

Aqui está o que eu tive que fazer para fazê-lo funcionar em todos os casos

Mapeamento:

HasManyToMany(x => x.RelatedBooks)
                .ParentKeyColumn("BookId")
                .ChildKeyColumn("RelatedBookId")
                .Table("RelatedBooks");

Código:

var book = currentSession.Get<Book>(bookId);

if (book != null)
{
    //Remove all of the Related Books
    book.RelatedBooks.Clear();

    //Get all other books that have this book as a related book
    var booksWithRelated = currentSession.CreateCriteria<Book>()
                                .CreateAlias("RelatedBooks", "br")
                                .Add(Restrictions.Eq("br.Id", book.Id))
                                .List<Book>();

    //Remove this book as a Related Book for all other Books
    foreach (var tempBook in booksWithRelated)
    {
        tempBook.RelatedBooks.Remove(book);
        tempBook.Save();
    }

    //Delete the book
    book.Delete();
}

questionAnswers(2)

yourAnswerToTheQuestion