Nhibernate GetById возвращает ObjectNotFoundException вставку NULL - PullRequest
6 голосов
/ 25 октября 2010

Я использую свободный Nhibernate. Этот код загружает экземпляр типа T из БД на основе его идентификатора.

public T GetById(IdT id, bool shouldLock)
    {
        T entity;

        if (shouldLock)
        {
            entity = (T) NHibernateSession.Load(persitentType, id, LockMode.Upgrade);
        }
        else
        {
            entity = (T) NHibernateSession.Load(persitentType, id);
        }

        return entity;
    }

Но у меня большая проблема. Когда я вызываю свойство, я получаю ObjectNotFoundException вместо null.

Как я могу сделать эту сущность обнуляемой и не возвращать исключение?

Ответы [ 3 ]

12 голосов
/ 25 октября 2010

Я бы использовал Get вместо Load.Get вернет null вместо исключения.

9 голосов
/ 25 октября 2010

Я думаю, вы ошибаетесь в том, что делает Load.Это создаст для вас прокси-объект NHibernate по идентификатору без фактического запроса к базе данных.

Когда вы вызываете свойство, оно запрашивает базу данных, если вы указали неверный идентификатор, то нет базового объекта, следовательно исключение.*

Нормальные ситуации, которые вы будете использовать, это то, что вы говорите, что у вас есть объект State и пользователь выбрал PA в раскрывающемся списке.Вместо того, чтобы запрашивать базу данных для объекта State, так как у вас уже есть ключ PA, вы можете вызвать Load и затем передать этот объект состояния в другой объект, чтобы иметь правильное отношение объекта X к состоянию PA.

Метод, который вы хотите использовать для общего получения или получения нулевого значения, если ключ не существует, это просто Session.Get<T>(object ID)

4 голосов
/ 25 октября 2010

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

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