NHibernate регистрирует и выполняет запрос дважды подряд - PullRequest
3 голосов
/ 10 марта 2009

Я использую: 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?

Ответы [ 3 ]

5 голосов
/ 12 марта 2009

Проблема была вызвана другим отображением, которое я объявил. У меня был класс, унаследованный от клиента, с которым было связано сопоставление. Это то, что заставило NHibernate сделать запрос дважды. Я заметил это, потому что при использовании Linq () он возвращал подкласс, а не самого клиента. Этот конкретный случай наследования и отображения был недостатком дизайна с моей стороны и был корнем всей проблемы!

1 голос
/ 11 марта 2009

Вы можете попробовать использовать превосходный NHibernate профилировщик для более детального просмотра происходящего. Он поставляется с 30-дневной пробной лицензией, а в бета-версии действует скидка на полную стоимость лицензии

1 голос
/ 11 марта 2009

У NHibernate нет проблем с SQL Express, я достаточно широко его использовал. Точно так же маловероятно, что Fluent NHibernate генерирует недопустимые отображения в этом простом сценарии (но не случайно).

Снимок в темноте, но я считаю, что NHibernate резервирует имя Id в качестве имени идентификатора, поэтому, когда он видит Id в запросе, он знает, что просто смотрит на внешний ключ вместо фактического присоединенного объекта. Возможно, ваше имя вместо идентификатора выбрасывает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...