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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top