Я использую: NHibernate, NHibernate.Linq и Fluent NHibernate в SQL Server Express 2008. Я выбираю объект, используя предикат для указанного свойства (сопоставление многие-один). У меня есть fetch = join, unique = true, lazy-load = false. Я включил журнал log4net, и при выполнении любого такого запроса он регистрирует два идентичных запроса SQL. Выполнение запроса возвращает одну строку, а когда я пытаюсь использовать метод расширения IQueryable.Single, он выдает исключение, указывающее, что возвращено более одной строки. Я также попытался выполнить запрос, используя стандартный метод IQuery.UniqueResult, с тем же результатом, он завершает запись в журнал и фактически выполняет запрос дважды, а затем выдает исключение, указывающее, что было несколько строк, однако выполнение фактического запроса в Management Studio возвращает только один результат. Когда я отключаю ведение журнала, я получаю ту же ошибку.
Сущности и отображения объявляются следующим образом (подразумеваются правильные модификаторы доступа и дисперсия типа элемента)
class User
{
int ID;
string UserName;
}
class Client
{
int ID;
User User;
Person Person;
Address Address;
}
class UserMap : ClassMap<User>
{
public UserMap()
{
Id(x => x.ID);
Map(x => x.UserName);
}
}
class ClientMap : ClassMap<Client>
{
public ClientMap()
{
Id(x => x.ID);
References(x => x.User).Unique();
...
}
}
Затем я вызываю такие запросы:
ISession s = GetNHibernateSession();
...
var client = s.Linq<Client>().SingleOrDefault(x => x.User.ID = 17);
or
var client = s.Linq<Client>().Where(x => x.User.ID = 17);
or
var client = s.CreateQuery("from Client as c where c.User.ID = 17").UniqueResult<Client>();
Во всех случаях выполняет два одинаковых запроса. Когда я включаю отложенную загрузку, клиент снова загружается с использованием двух запросов, однако при доступе к члену, например Person, выполняется только один дополнительный запрос.
Возможно, это результат того, что Fluent генерирует неправильное отображение? Или выпуск SQL Server Express неправильно используется NHibernate?