NHibernate отношения многие ко многим - проблема при удалении части отношения

StackOverflow https://stackoverflow.com/questions/1812573

Вопрос

У меня есть отношения многие ко многим между командой и сотрудником.

Я сопоставил их следующим образом:

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");
    }
}

Затем я создал 3 команды и 2 сотрудника.

TeamID  EmployeeID
1       1
1       2
2       2
3       1

Сотрудник1 также имеет 2 элемента LoanedItem (книги, журналы). У Employee2 нет LoanedItems.

Теперь я хочу удалить Employee1 из Team1 и Team3. В команде 1 тоже сотрудник2. Поэтому, когда я удаляю Employee1, я предполагаю, что Employee1 удаляется, а также Team3, потому что я также предполагаю, что команда может существовать только тогда, когда у нее есть Employe, и наоборот. Поэтому Team1 не может быть удалена, потому что у нее есть Employee2 и она все еще может существовать.

Я использовал следующие строки кода с новым сеансом:

var loadedEmployee = session.Get<Employee>(1);
session.Delete(loadedEmployee);
transaction.Commit();

Но что происходит? - & GT; NHibernate удаляет все команды и всех сотрудников ! - & GT; NHibernate правильно обновил мою таблицу LoanedItem, установив для FK EmployeeID значение NULL.

Что там не так?

Это было полезно?

Решение

Я ответил на похожий вопрос здесь: Что правильный способ определения отношений «многие ко многим» в NHibernate, позволяющий удалять, но избегать дублирования записей

Чтение вопроса и моего ответа, возможно, поможет вам понять, что происходит с вашей ассоциацией «многие ко многим».

Другие советы

Из-за Cascade.All на отображении HasManyToMany.

Вместо этого используйте Cascade.SaveAndUpdate, если вы хотите избежать каскадного действия удаления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top