Это не совсем ответ, но мне нужно было иметь возможность форматировать и не иметь ограничения символов.
У меня была та же проблема, но поскольку решения были не очень простыми, я решил обойти ее, изменив структуру.
Несколько вещей, на которые я смотрел, которые казались многообещающими, были SQLQueries, которые возвращали объекты в качестве псевдонима, который был объединен с помощью Queryover.
Или - добавление предложения .Where к отображению hasMany. Все, что я прочитал об этой опции, говорит, что она очень ограничена. Хотя логика сделать то, что вы просите, кажется довольно простой - Select Distinct ... From ... Where (OneUser = UserId or OtherUser = UserId)
EDIT:
Посмотрите на JoinQueryOver здесь: http://nhibernate.info/blog/2009/12/17/queryover-in-nh-3-0.html
И собственные запросы SQL здесь: http://knol.google.com/k/nhibernate-chapter-14-native-sql#
Хотя это не решение уровня сопоставления, вы можете указать критерии в предложении where при выборе пользователей, чтобы их Друзья были заполнены правильно. Если вы не можете добиться необходимой фильтрации с помощью Fluent QueryOver, я думаю, что вы могли бы сделать псевдоним из запроса Native SQL и JoinQueryOver / JoinAlias для соответствующего заполнения коллекции Friends.
Прошу прощения, если это вся информация, которую вы уже знаете. В любом случае - мне интересно увидеть решение этой проблемы.
** Редактировать 2: **
Я немного поиграл с этим, и это настолько близко, насколько я мог понять:
Public Class UserMapping
Inherits ClassMap(Of User)
Public Sub New()
Id(Function(x) x.Id).Column("UserID")
Map(Function(x) x.Name).Length(50).Not.Nullable().Column("UserName")
HasMany(Function(x) x.Friends).Inverse.KeyColumn("UserID").Where("Users.UserID in (select Friendships.FriendOne from Friendships where Friendships.FriendTwo = UserID) or UserID in (select Friendships.FriendTwo from Friendships where Friendships.FriendOne = UserID)")
Table("Users")
End Sub
End Class
Запрос не совсем работает, потому что он продолжает накладывать дополнительное ограничение в предложении where, в котором UserID должен равняться внешнему userId, что противоречит цели подзапроса.
Я видел еще один пост, где предлагалось два других решения.
Создание двух дочерних коллекций. Один, который отображает друзей, где текущий Пользователь является Основным другом, а другой, где текущий пользователь является Вторым другом. Затем вы можете создать свойство, которое будет объединять их вне того, как NH запрашивает его.
Создать избыточные записи в базе данных, чтобы у каждого пользователя была запись, где он является PrimaryUser для всех отношений, которыми он делится с другими людьми.
На основании этих двух вариантов - я бы, вероятно, выбрал вариант № 1.