Причина, по которой NHibernate выдает инструкцию SELECT при попытке доступа к коллекции Friends, заключается в том, что она не была инициализирована в момент загрузки пользовательского объекта. Вы можете принудительно загрузить коллекцию, используя следующий запрос:
User user = session
.CreateCriteria(typeof(User))
.SetFetchMode("Friends", FetchMode.Eager)
.Add(Expression.IdEq(1))
.UniqueResult<User>();
или добавив fetch = "join" в файл сопоставления:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Test" assembly="test">
<class name="User" table="Users">
<id name="Id" column="id">
<generator class="native"/>
</id>
<property name="Name" column="name"/>
<set name="Friends" table="Friends" fetch="join">
<key column="user_id"/>
<many-to-many class="User" column="friend_id"/>
</set>
</class>
</hibernate-mapping>
Стоит отметить, что существует разница между UniqueResult и session.Load. Если пользователь не найден в базе данных, вы получите исключение ObjectNotFoundException со вторым подходом, а UniqueResult вернет значение null. Вы можете использовать любой подход в зависимости от ваших потребностей.