Скорее всего, вам вообще не нужно поддерживать это, если вы удалите один из избыточных внешних ключей.Ваша схема базы данных не должна допускать подобных аномалий (userX ссылается на contactX, но contactX ссылается на userY).Концептуально у вас есть личные отношения между пользователем и контактом.Почему бы не иметь один-к-одному в отображениях NHibernate?Если это из-за отложенной загрузки, то не поддерживается для nullable один-к-одному в NHibernate?Существует решение этой проблемы, которое не включает избыточные внешние ключи в базе данных.
1) В отображении пользователя определите фиктивный список.Список может содержать только один или ноль элементов.Ноль обрабатывается как NULL (нет контакта).
<bag
name="_contact"
table="UserContacts"
lazy="true"
inverse="true"
cascade="all-delete-orphan" >
<key column="UserId" />
<one-to-many class="Contact" />
</bag>
В сопоставлении контактов определите один к одному:
<one-to-one name="_user" class="User" constrained="true" />
В базе данных вам нужно иметь PK Users.Id иодин (!) внешний ключ Contacts.UserID.
2) Другой вариант - просто иметь много-к-одному в сопоставлении пользователей и один FK Users.ContactId
<many-to-one
name="_contact"
column="ContactId"
cascade="all-delete-orphan"
unique="true"
lazy="proxy"/>
В любом случае запрашиваемое вами обслуживание не требуется и аномалииневозможны.