Fluent-NHibernate: Как создать отношения многие-ко-многим с уникальным ограничением - PullRequest
5 голосов
/ 12 ноября 2009

Я хочу создать отношение «многие ко многим», но я хочу, чтобы в новой таблице (MessageReceivers) было уникальное ограничение для обоих столбцов (AdvanceMessageId, UserId):

mapping.HasManyToMany(x => x.Receivers)
       .WithParentKeyColumn("AdvanceMessageId")
       .WithChildKeyColumn("UserId")
       .Cascade.All()
       .LazyLoad()
       .WithTableName("MessageReceivers");

Спасибо за помощь

Ответы [ 2 ]

6 голосов
/ 11 февраля 2013

Старый пост ... но в случае, если кто-то еще прибудет сюда в поисках ответа:

Вам необходимо добавить .AsSet () к определению отображения HasManyToMany.


т.е.

mapping.HasManyToMany(x => x.Users)
       .WithTableName("MessageReceivers")
       .WithParentKeyColumn("UserId")
       .WithChildKeyColumn("AdvanceMessageId")
       .Inverse().AsSet();

Это установит уникальное составное ограничение первичного ключа для таблицы ссылок, которая использует оба столбца. (кластерный индекс)

Обратной стороной является то, что AsSet () нельзя использовать со свойствами коллекции типа IList, поэтому для циклов без приведения нет.

Я использую ICollection и создаю их экземпляры как HashSet для своих приложений, и это хорошо работает.


Подробнее об управлении коллекциями с помощью Fluent Nhibernate:

Список: упорядоченный набор объектов, допускается дублирование. Используйте .net IList в коде. Столбец индекса необходимо сопоставить в NHibernate.

Set: Неупорядоченный набор уникальных объектов, дубликаты не допускаются. Используйте Iesi.Collection.ISet в коде. Важно переопределить GetHashCode и Equals, чтобы указать бизнес-определение дубликата. Может быть отсортировано путем определения порядка или путем определения компаратора, приводящего к результату SortedSet.

Сумка: неупорядоченный список объектов, допускаются дубликаты. Используйте .net IList в коде. Столбец индекса в списке не отображается и не учитывается NHibernate.

2 голосов
/ 11 февраля 2010

Вы должны также отобразить обратную сторону отношений как

mapping.HasManyToMany(x => x.Users)
       .WithTableName("MessageReceivers")
       .WithParentKeyColumn("UserId")
       .WithChildKeyColumn("AdvanceMessageId")
       .Inverse();

В новейшей версии Fluent NHibernate вам придется изменить

  • WithTableName -> Таблица

  • WithParentKeyColumn -> ParentKeyColumn

  • WithChildKeyColumn -> ChildKeyColumn

...