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í?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top