NHibernate Relación Muchos a Muchos - Problema al eliminar una parte de la relación
-
06-07-2019 - |
Pregunta
Tengo una relación de muchos a muchos entre un equipo y una entidad de empleado.
Los asigné de la siguiente manera:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
// identifier mapping
Id(p => p.Id).Column("EmployeeID");
// column mapping
Map(p => p.EMail);
Map(p => p.LastName);
Map(p => p.FirstName);
// relationship mapping
HasManyToMany(m => m.Teams).Table("EmployeeTeam")
.Inverse()
.Cascade.All()
.AsSet()
.LazyLoad()
.ParentKeyColumn("EmployeeID")
.ChildKeyColumn("TeamID");
HasMany(p => p.LoanedItems).Cascade.SaveUpdate().KeyColumn("EmployeeId");
}
}
public class TeamMap : ClassMap<Team>
{
public TeamMap()
{
// identity mapping
Id(p => p.Id).Column("TeamID");
// column mapping
Map(p => p.Name);
// relationship mapping
HasManyToMany(m => m.Employees)
.Table("EmployeeTeam")
.LazyLoad()
.Cascade.All()
.AsSet()
.ParentKeyColumn("TeamID")
.ChildKeyColumn("EmployeeID");
}
}
Luego creé 3 equipos y 2 empleados:
TeamID EmployeeID
1 1
1 2
2 2
3 1
El empleado1 también tiene 2 artículos prestados (libros, revistas). Employee2 no tiene LoanedItems.
Ahora quiero eliminar Employee1, que está en Team1 y Team3. En el Equipo 1 también está Empleado2. Entonces, cuando elimino Employee1, supongo que Employee1 se elimina y también Team3, porque también supongo que un Equipo solo puede existir cuando tiene un Employee y viceversa. Por lo tanto, el Equipo1 no se puede eliminar porque tiene Empleado2 y aún puede existir.
Utilicé las siguientes líneas de código con una nueva sesión:
var loadedEmployee = session.Get<Employee>(1);
session.Delete(loadedEmployee);
transaction.Commit();
¿Pero qué pasa? - > ¡NHibernate elimina todos los equipos y todos los empleados ! - > NHibernate actualizó mi tabla LoanedItem correctamente estableciendo FK EmployeeID en NULL.
¿Qué hay de malo allí?
Solución
He respondido una pregunta similar aquí: Qué es la forma correcta de definir relaciones de muchos a muchos en NHibernate para permitir eliminaciones pero evitando registros duplicados
Leer la pregunta y mi respuesta tal vez lo ayudarán a comprender lo que está sucediendo con su asociación de muchos a muchos.
Otros consejos
Debido a la Cascada. Todo en el mapeo HasManyToMany.
Use Cascade.SaveAndUpdate en su lugar, si desea evitar la acción de borrar cascada.