NHibernate отношения многие ко многим - проблема при удалении части отношения
-
06-07-2019 - |
Вопрос
У меня есть отношения многие ко многим между командой и сотрудником.
Я сопоставил их следующим образом:
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, если вы хотите избежать каскадного действия удаления.