Старый пост ... но в случае, если кто-то еще прибудет сюда в поисках ответа:
Вам необходимо добавить .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.