NHibernate la relazione Many to Many - Problema durante l'eliminazione di una parte della relazione
-
06-07-2019 - |
Domanda
Ho molte o molte relazioni tra una squadra e un'entità dipendente.
Li ho mappati come segue:
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");
}
}
Quindi ho creato 3 team e 2 dipendenti:
TeamID EmployeeID
1 1
1 2
2 2
3 1
The Employee1 ha anche 2 LoanedItems (Libri, Riviste). Employee2 non ha oggetti in prestito.
Ora voglio eliminare Employee1, che è in Team1 e Team3. Nel Team 1 c'è anche Employee2. Quindi, quando elimino Employee1, presumo che Employee1 sia eliminato e anche Team3, poiché presumo anche che un Team possa esistere solo quando ha un Employe e viceversa. Quindi Team1 non può essere eliminato, perché ha Employee2 e può ancora esistere.
Ho usato le seguenti righe di codice con una nuova sessione:
var loadedEmployee = session.Get<Employee>(1);
session.Delete(loadedEmployee);
transaction.Commit();
Ma cosa succede? - > NHibernate elimina tutte le squadre e tutti i dipendenti ! - > NHibernate ha aggiornato correttamente la mia tabella LoanedItem impostando FK EmployeeID su NULL.
Cosa c'è che non va lì?
Soluzione
Ho risposto a una domanda simile qui: What è il modo corretto di definire relazioni molti-a-molti in NHibernate per consentire l'eliminazione ma evitando record duplicati
Leggere la domanda e la mia risposta forse ti aiuterà a capire cosa sta succedendo nella tua associazione molti-a-molti.
Altri suggerimenti
A causa di Cascade.All sulla mappatura HasManyToMany.
Utilizza invece Cascade.SaveAndUpdate, se desideri evitare l'azione di eliminazione in cascata.