Как проверить нулевое значение для прокси - PullRequest
2 голосов
/ 23 января 2012

У меня есть общий метод для загрузки объекта.Мне нужно проверить значение результата на нулевое значение.

public TEntity LoadById(long id)
{
     TEntity result = SessionInstance.Load<TEntity>(id);

     if (result != null)                      //This condition is always true
         if (result.Id == 0 )                 //Throws ObjectNotFoundException 
              throw new Exception("Ex Text"); 

     return result;
}

Но мое условие (if (result != null)) всегда истинно, и следующая строка result.Propagate() - это выброс ObjectNotFoundException исключение из этого сообщения: No row with the given identifier exists[RCISP.Domain.Entities.Person#1000]

Поскольку сущность результата является прокси.Как я могу проверить условие для нулевого значения в прокси?

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Даниэль первоначальный ответ правильный.Согласно блогу Айенде , Load следует использовать только тогда, когда вы знаете , что элемент существует в базе данных.

Загрузка будет никогда вернуть ноль.Он всегда будет возвращать объект или выдавать исключение.Поскольку у нас есть такой договор, для Load допустимо не попадать в базу данных при его вызове, вместо этого он может свободно возвращать прокси.

Почему это полезно?Хорошо, если вы знаете , что значение существует в базе данных, и вы не хотите платить за дополнительный выбор, чтобы иметь это, но вы хотите получить это значение, чтобы мы могли добавить эту ссылку на объект, вы можете использовать Load, чтобы сделать это

В вашем примере, ObjectNotFoundException может произойти, только если элемент не существует в базе данных.Если вы не можете гарантировать наличие предмета, вам нужно использовать Get, а не Load.

3 голосов
/ 23 января 2012

Используйте NHibernate's ISession.Get вместо ISession.Load.Load выдает исключение, если запрошенный элемент не существует, но он также может возвращать прокси-сервер, который позже используется для загрузки объекта из базы данных, и будет генерировать только тогда, если элемент не существует.Вот что с вами происходит.
Get с другой стороны возвращает null, если элемент не существует в базе данных.Именно то, что вы хотите.

Подробнее по этой теме здесь .

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