Метод выдает исключение нулевой ссылки после возврата ненулевого значения

У меня есть сервисный метод, который очень просто получает информацию обо всех хранилищах в базе данных. Он сопоставляет хранилища из EF с помощью Auto Mapper и возвращает общий ответ типа StoreDTO (простой POCO).

Проблема в следующем: метод выполняется просто отлично, я прохожу весь путь до конца. Каждое свойство в response имеет значение, ничто не равно null. Список заполнен элементами, элементы в списке действительны и т. д. и т. д.

Но следующий код генерирует исключение NullReferenceException, как только возвращается GetAllStores:

ListResponseDTO<StoreDTO> allStores = Services.Stores.Stores.GetAllStores();

РЕДАКТИРОВАТЬ: Вот скриншот отладчика, когда он возвращается. Вы можете видеть в окне просмотра, что значения выглядят кошерно: http://i.imgur.com/rd853.png

Любая помощь приветствуется. Вот код из метода:

    public static ListResponseDTO<StoreDTO> GetAllStores()
    {
        ListResponseDTO<StoreDTO> response = new ListResponseDTO<StoreDTO>("Get Stores not successful");

        try
        {
            response.Items = new List<StoreDTO>();
            using (DomainEntities db = new DomainEntities(Global.ConnectionString))
            {
                foreach (var IndividualStore in db.Stores)
                {
                    Mapper.CreateMap<Store, StoreDTO>();
                    var IndividualStoreDTO = Mapper.Map<Store, StoreDTO>(IndividualStore);
                    response.Items.Add(IndividualStoreDTO);
                }
            }
            response.Message = "Store(s) retrieved successfully";
            response.Success = true;
        }
        catch (Exception ex)
        {
            Logging.Log("Get All Stores", response.Message + " " + ex.ToString(), Logging.LogPriority.Error, "Store Operations");
        }
        return response;
    }

Вот общее определение DTO:

public class ListResponseDTO<DtoType> : ResponseDTO
{
    public ListResponseDTO()
        : base()
    {
        Items = new List<DtoType>();
    }

    public ListResponseDTO(string defaultMessage)
        : base(defaultMessage)
    {
        Items = new List<DtoType>();
    }

    public List<DtoType> Items;
}

Если вам интересно, ResponseDTO имеет два свойства:

bool Success

string Message

Вот детали исключения, боюсь, это не слишком полезно:

System.NullReferenceException was unhandled by user code
  Message=Object reference not set to an instance of an object.
  Source=Infinity
  StackTrace:
   at PLM.Infinity.Default.GetDrawersForUser() in C:\Users\jlucas\Documents\Visual Studio 2010\PLM Source Control\Utilities\InfinityInterface\Infinity\Default.aspx.cs:line 96
  InnerException: 

person lucrativelucas    schedule 20.02.2012    source источник
comment
Попробуйте удалить try/catch и посмотрите, что произойдет   -  person John Saunders    schedule 20.02.2012
comment
То же самое. Он не генерирует исключение в методе, он генерирует его только после возврата метода.   -  person lucrativelucas    schedule 20.02.2012
comment
Как выглядит метод GetAllStores, единственный способ, которым вы получаете Null после возврата, заключается в том, что вы либо снова его обновляете, либо у вас есть какой-то странный рекурсивный вызов метода/свойства, который сбрасывает объект, а также зачем нужна эта строка ListResponseDTO‹StoreDTO› ответ = новый ListResponseDTO‹StoreDTO›(получить магазины не удалось);   -  person MethodMan    schedule 20.02.2012
comment
@DJKRAZE: метод GetAllStores — это второй фрагмент кода.   -  person Ry-♦    schedule 20.02.2012
comment
Общий ListResponseDTO принимает строку в конструкторе для установки возвращаемого сообщения. Если возникает исключение, исходный ответ возвращается с сообщением об ошибке, а логическое значение success остается ложным. если метод выполняется успешно, сообщение изменяется на сообщение об успешном выполнении.   -  person lucrativelucas    schedule 20.02.2012
comment
@DJKRAZE: он не выглядит перегруженным, а response.Items — это List<StoreDTO> (см. фрагмент 3), так что проблем нет.   -  person Ry-♦    schedule 20.02.2012
comment
@DJKRAZE: Не имеет значения. List<StoreDTO>ListResponseDTO<DtoType>.   -  person Ry-♦    schedule 20.02.2012
comment
Ну, даже если посмотреть на код, он не должен возвращать null, когда доходит до строки return response; так что должно быть где-то еще в коде, где этот ответ обнуляется... только что заметил что-то, где используются allstores..???   -  person MethodMan    schedule 20.02.2012
comment
Можете ли вы опубликовать полную трассировку стека исключения?   -  person Chris Dunaway    schedule 20.02.2012
comment
@DJKRAZE Точно. Он не должен возвращать null, но после того, как метод возвращает, он выдает исключение. Я просмотрел каждую строку кода, вплоть до скобок, окружающих метод, и response не был нулевым. Но программа так думает.   -  person lucrativelucas    schedule 20.02.2012
comment
Какие бывают типы Services.Stores и Services.Stores.Stores? Может возникнуть огромная скрытая проблема с отложенным выполнением.   -  person Ry-♦    schedule 20.02.2012
comment
@minitech Services.Stores — это пространство имен, а Services.Stores.Stores — статический класс службы без свойств, только методы.   -  person lucrativelucas    schedule 20.02.2012
comment
Ваша трассировка стека, похоже, также подтверждает это подозрение. Я не знаю о базах данных в .NET, но это похоже на проблему.   -  person Ry-♦    schedule 20.02.2012
comment
Можете ли вы показать больше контекста того, где вы звоните Services.Stores.Stores.GetAllStores()? и было ли в трассировке стека что-нибудь во внутреннем исключении или на самом деле оно остановилось?   -  person Chris    schedule 20.02.2012
comment
Опубликованная мной трассировка стека завершена, я использовал информацию об исключении копирования в буфер обмена, а InnerException был нулевым. Я также разместил скриншот отладчика: i.imgur.com/rd853.png   -  person lucrativelucas    schedule 20.02.2012
comment
Предположительно GetDrawersForUser() это метод со строкой ListResponseDTO<StoreDTO> allStores = Services.Stores.Stores.GetAllStores(); в нем? Также я предполагаю, что на вашем снимке экрана, когда вы нажимаете «перешагнуть» в этот момент, и он возвращается к родителю, это когда он сразу же выдает ошибку? Есть ли шанс увидеть больше метода GetDrawersForUser(), чтобы понять, связано ли это с тем, как вы его вызываете?   -  person Chris    schedule 20.02.2012
comment
Не видя кода вызова, я не думаю, что кто-то сможет вам помочь. В частности, нам нужен код, окружающий строку 96 файла Default.aspx.cs; и, если это вызов метода для чего-то еще, этот код.   -  person NotMe    schedule 22.02.2012


Ответы (1)


Можете ли вы поместить предложение where, чтобы вы возвращали только магазины, в которых вы уверены, что у них есть все поля, и посмотреть, сохраняется ли проблема?

Иногда это происходит из-за того, что где-то в вашем наборе данных отсутствуют данные, и во время отладки вы их не видите.

Вы также можете попробовать еще раз поймать вызов Mapper и посмотреть, не происходит ли что-то там.

Это больше предложения, чем ответ.

person Oakcool    schedule 22.02.2012