NHibernate relacionamento muitos para muitos - Issue ao excluir uma parte da relação
-
06-07-2019 - |
Pergunta
Eu tenho muitos para muitos relação entre uma equipe e uma entidade Employee.
Eu mapeado-los da seguinte forma:
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");
}
}
Então eu criei 3 equipes e 2 Funcionários:
TeamID EmployeeID
1 1
1 2
2 2
3 1
O Employee1 tem também 2 LoanedItems (livros, revistas). Employee2 não tem LoanedItems.
Agora eu quero excluir Employee1, que está em Team1 e Team3. Em Time 1 é também Employee2. Então, quando eu apagar Employee1, presumo que Employee1 é excluído e também Team3, porque eu também assumir que uma equipe só pode existir quando se tem um Employe e vice-versa. Então Team1 não pode ser excluído, porque tem Employee2 e pode ainda existe.
Eu usei as seguintes linhas de código com uma nova sessão:
var loadedEmployee = session.Get<Employee>(1);
session.Delete(loadedEmployee);
transaction.Commit();
Mas o que acontece? -> NHibernate exclui todas as equipes e todos os Colaboradores ! -.> NHibernate atualizadas minha mesa LoanedItem corretamente definindo o FK EmployeeID para NULL
O que está errado lá?
Solução
Eu respondi uma pergunta semelhante aqui: que é a maneira correta para definir muitos-para-muitos relacionamentos em NHibernate para permitir exclusões, mas evitando registros duplicados
A leitura da pergunta e minha resposta talvez irá ajudá-lo a entender o que está acontecendo com a sua associação muitos-para-muitos.
Outras dicas
Por causa da Cascade.All no mapeamento HasManyToMany.
Use Cascade.SaveAndUpdate em vez disso, se você quiser evitar a ação em cascata delete.