Вы говорите о бизнес-логике. NHibernate не предназначен для реализации бизнес-логики.
Что делает ваш код:
Вы отобразили две разные коллекции TeamEmployee
s, одну в Team
, одну в Employee
. В своем коде вы добавляете элементы в обе коллекции, каждый раз создавая новые экземпляры TeamEmployee
. Так почему вы ожидаете, что NHibernate не должен хранить все эти отдельные экземпляры?
Что вы можете сделать, чтобы исправить это:
Вы сделали TeamEmployee
сущностью (в отличие от типа значения). Чтобы создать экземпляр только один раз, вам нужно будет создать его экземпляр только один раз в памяти и повторно использовать в обеих коллекциях. Делайте это только тогда, когда вам действительно нужен этот класс в вашей доменной модели. (например, потому что он содержит дополнительную информацию об отношениях и фактически является собственной сущностью.)
Если вам не нужен класс, гораздо проще отобразить его как отношение «многие ко многим» (как уже было предложено Крисом Конвеем ). Поскольку в памяти есть две коллекции, которые, как ожидается, будут содержать одни и те же данные, вы говорите NHibernate игнорировать одну из них при сохранении, используя Inverse
.
родительская проблема на обоих концах
На обоих концах нет родителя . Я думаю, что ясно, что ни команда, ни сотрудник не являются родителями другого, они независимы. Вы, вероятно, имеете в виду, что они оба родители среднего уровня TeamEmployee
. Они не могут быть родителями (и, следовательно, владельцами) одного и того же экземпляра. Либо один из них является родительским, либо это другой независимый экземпляр, что значительно усложняет управление им (именно так вы реализовали его сейчас). Если вы отобразите его как отношение «многие ко многим», оно будет управляться NHibernate.
Для выполнения вашей бизнес-логики:
- хранение новых команд и новых сотрудников
- управление отношениями и их синхронизация
- удаление команд и сотрудников, когда они больше не используются. (В NHibernate нет явной реализации постоянного сбора мусора по нескольким причинам.)