Свободное отображение NHibernate двунаправленной ассоциации «многие ко многим» с использованием класса ассоциации - PullRequest
3 голосов
/ 22 мая 2011

У меня двунаправленная связь «многие ко многим» между EntityA и EntityB, и я использую класс ассоциации EntityABLink, чтобы смоделировать это, потому что есть другие атрибуты об отношениях, которые мне нужно отслеживать.Кроме того, у меня также есть другой класс, который содержит ссылку на определенную связь между EntityA и EntityB, поэтому я рассматриваю класс ассоциации как полноценный объект.

В EntityA у меня есть свойство только для чтения, которое возвращает список связанных объектов EntityB, и, аналогично, в EntityB у меня есть свойство только для чтения, которое возвращает список связанных объектов EntityA.Обратите внимание, что для этих свойств я скрываю тот факт, что ассоциация реализуется через класс ассоциации.(У меня также есть специальные методы для обновления отношений, которые скрывают реализацию.) За кулисами в EntityA и EntityB у меня есть частные коллекции типа EntityABLink.

Поскольку картинка стоит тысячи слов, я уже описал следующее:
enter image description here

(еще раз отметим, что общедоступные свойства только для чтения в EntityA иEntityB не принадлежат к тому же типу, что и частные члены, которые их поддерживают.)

Пока все хорошо.Теперь я хочу сохранить эти объекты в базе данных, используя автоматические переопределения Fluent NHibernate.Когда дело доходит до отображения, мне нравится думать о вышеизложенном, используя это функционально эквивалентное представление:
enter image description here Из этой диаграммы ясно, что то, что мне действительно нужно, это два двунаправленных одномного отношений.

При отображении вышеизложенного я понимаю, что мне нужно что-то вроде этого:

В переопределении автоматического сопоставления EntityA:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityA>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate(); 
mapping.IgnoreProperty(x => x.EntityBList);

В переопределении автоматического сопоставления EntityB:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityB>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate(); 
mapping.IgnoreProperty(x => x.EntityAList);

В переопределении автоматического определения EntityABLink:

mapping.References<EntityA>(x => x.EntityA).Not.Nullable();
mapping.References<EntityB>(x => x.EntityB).Not.Nullable();

Однако, когда я пытаюсь это сделать, я получаю следующую ошибку:

"Не удалось найти получатель для свойства '_AssociationList 'в классе' EntityB '. "

У меня должно быть что-то не так с моими отображениями, но я не уверен, что.Есть идеи?

1 Ответ

1 голос
/ 25 мая 2011

У меня сейчас работает. Итак, вот в чем дело ... Я вернулся к Fluent NHibernate версии 1.1 (в частности, 1.1.0.685). Затем, хотя примеры сопоставления, использующие «Reveal.Member», не показывают его как необходимый, я добавил «Access.Field ()» в сопоставление для обоих EntityA._AssociationList и EntityB._AssociationList. Вот рабочие сопоставления.

В переопределении автоматического сопоставления EntityA:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityA>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate().Access.Field(); 
mapping.IgnoreProperty(x => x.EntityBList);

В переопределении автоматического преобразования EntityB:

mapping.HasMany<EntityABLink>(Reveal.Member<EntityB>(“_AssociationList”)).Inverse().AsBag().Cascade.SaveUpdate().Access.Field(); 
mapping.IgnoreProperty(x => x.EntityAList);

В переопределении автоматического определения EntityABLink:

mapping.References<EntityA>(x => x.EntityA).Not.Nullable();
mapping.References<EntityB>(x => x.EntityB).Not.Nullable();

Как только он работал в FNH 1.1, я попытался обновить его до FNH 1.2. Ничего хорошего. Я пробовал 1.2.0.694, а также 1.2.0.712, и оба из них все еще выдают неверное сообщение об ошибке, что другая "сущность" (которая на самом деле является enum!) не имеет идентификатора.

Свободный NHibernate - замечательный инструмент, поэтому я надеюсь, что ошибка в последней версии будет исправлена. :-)

...