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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top