Relation NHibernate Many To Many - Problème lors de la suppression d’une partie de la relation
-
06-07-2019 - |
Question
J'ai de nombreuses relations entre une équipe et une entité employé.
Je les ai cartographiés comme suit:
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");
}
}
Ensuite, j'ai créé 3 équipes et 2 employés:
TeamID EmployeeID
1 1
1 2
2 2
3 1
L’employé1 dispose également de 2 objets prêtés (livres, magazines). Employee2 n'a pas d'objets prêtés.
Je souhaite maintenant supprimer Employee1, qui se trouve dans Team1 et Team3. Dans l'équipe 1, il y a aussi Employee2. Ainsi, lorsque je supprime Employee1, je suppose que Employee1 est supprimé, ainsi que Team3, car je suppose également qu'une équipe ne peut exister que si elle possède un Employe et inversement. Donc, Team1 ne peut pas être supprimé, car il a Employee2 et peut toujours exister.
J'ai utilisé les lignes de code suivantes avec une nouvelle session:
var loadedEmployee = session.Get<Employee>(1);
session.Delete(loadedEmployee);
transaction.Commit();
Mais que se passe-t-il? - > NHibernate supprime toutes les équipes et tous les employés ! - > NHibernate a mis à jour correctement ma table LoanedItem en définissant le FK EmployeeID sur NULL.
Qu'est-ce qui ne va pas là-bas?
La solution
J'ai répondu à une question similaire ici: quoi est le bon moyen de définir des relations plusieurs à plusieurs dans NHibernate pour permettre les suppressions tout en évitant les doublons
La lecture de la question et ma réponse vous aideront peut-être à comprendre ce qui se passe dans votre association plusieurs-à-plusieurs.
Autres conseils
En raison de Cascade.All sur le mappage HasManyToMany.
Utilisez plutôt Cascade.SaveAndUpdate si vous souhaitez éviter l'action de suppression en cascade.