Fluidez de referencia de NHibernate Muchos a muchos

Tengo una entidad llamada Libros que puede tener una lista de más libros llamados Libros relacionados.

La entidad abreviada del Libro se ve así:

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

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

Así es como se ve el mapeo para esta relación

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

Aquí hay una muestra de los datos que luego se generan en la tabla RelatedBooks:

BookId     RelatedBookId
1          2
1          3

El problema ocurre cuando intento eliminar un libro. Si elimino el libro que tiene una ID de 1, todo funciona bien y la tabla RelatedBooks tiene los dos registros correspondientes eliminados. Sin embargo, si intento eliminar el libro con un ID de 3, aparece el error "La instrucción DELETE está en conflicto con la restricción REFERENCE" FK5B54405174BAB605 ". El conflicto se produjo en la base de datos" Test ", tabla" dbo.RelatedBooks ", columna 'RelatedBookId '".

Básicamente, lo que está sucediendo es que el Libro no se puede eliminar porque el registro en la tabla RelatedBooks que tiene un RelatedBookId de 3 nunca se elimina.

¿Cómo consigo que se elimine ese registro cuando elimino un libro?

EDITAR

Después de cambiar Cascade de SaveUpdate () a All (), el mismo problema todavía existe si intento eliminar el Libro con una ID de 3. También con Cascade configurado en All (), si elimino el Libro con y la ID de 1, entonces los 3 libros (ID: 1, 2 y 3) se eliminan para que tampoco funcione.

Al observar el SQL que se ejecuta cuando se llama al método Book.Delete () cuando elimino el Libro con un ID de 3, parece que la instrucción SELECT está mirando la columna incorrecta (que supongo que significa que la declaración DELETE de SQL cometería el mismo error, por lo tanto, nunca eliminaría ese registro). Aquí está el SQL para el libro relacionado

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

La declaración WHERE debería verse así para el caso particular:

WHERE relatedboo0_.RelatedBookId = 3

SOLUCIÓN

Esto es lo que tuve que hacer para que funcionara en todos los casos

Cartografía:

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();
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta