2016-09-25 2 views
0

Вот запрос:EF6 асинхронные объекты объектов null?

using (var _context = GetCommonDataContext()) 
    { 
     return await _context.AnswerSelectListEntries 
      .Include(asle => asle.Optional) 
      .OrderBy(asle => asle.DisplayOrder) 
      .Select(asle => new AnswerSelectListEntryDTO() 
      { 
       Id = asle.Id, 
       AnswerSelectListId = asle.AnswerSelectListId, 
       ShortAnswer = asle.ShortAnswer, 
       LongAnswer = asle.LongAnswer, 
       CounterpartyGroupId = asle.CounterpartyGroupId, 
       Optional = new AnswerDefDTO() 
       { 
        Id = asle.Optional.Id, 
        Name = asle.Optional.Name, 
        AnswerType = asle.Optional.AnswerType, 
        MultiplierAnswerType = asle.Optional.MultiplierAnswerType, 
        IntRangeLow = asle.Optional.IntRangeLow, 
        IntRangeHigh = asle.Optional.IntRangeHigh, 
        AnswerSelectListId = asle.Optional.AnswerSelectListId 
       }, 
       AnswerDefId = asle.AnswerDefId, 
       PartyType = asle.PartyType, 
       DisplayOrder = asle.DisplayOrder 
      }).ToListAsync(); 
    } 

Я получаю сообщение об ошибке (брошенной из подзапроса), что Id, и AnswerType (это перечисление) не может быть приведен к их коллегам (Int и перечисления), потому что они ноль. Проблема в том, что они не являются нулевыми (и не являются нулевыми в db). Так или иначе, свойства asle.Optional устанавливаются в нуль (даже если они не являются нулевыми). Я предполагаю, что это имеет какое-то отношение к асинхронному, но не уверен в чем.

Фиксированный с помощью:

Optional = asle.Optional == null ? null : new AnswerDefDTO()... 
+0

Почему вы думаете, что это имеет какое-либо отношение к async? это один запрос - к какому SQL-запросу он переводится во время выполнения? Должен ли 'AnswerSelectListEntries' иметь' Факультативный'? Каково точное исключение? – peter

+0

@peter Я не знаю, что это связано с необязательным. Я просто догадывался. AnswerSelectListEntry.optional не требуется, иногда оно равно null. Ожидается, что когда будет задано значение AnswerSelectListEntry.optional, будет также заполнен ответ ReplySelectListEntryDTO.Optional. – pQuestions123

+0

да, поэтому я, безусловно, не специалист в EF6, чтобы узнать, какие исключения будут выбрасываться в какое время, но мне кажется, что вы относитесь к asle.Optional, как будто это никогда не может быть нулевым что ** может ** быть источником ошибки. Но поскольку я никогда не буду делать что-то подобное, мне никогда не приходилось сталкиваться с проблемой «Что произойдет, когда я получаю доступ к свойству включенной таблицы, которая на самом деле является нулевой?» - также способ, которым вы интерпретируете исключение, может быть предвзятым, поэтому исходное исключение может помочь. – peter

ответ

1

Мое предположение было бы, что, так как эта вещь не является обязательным, и делает какие-то присоединиться, скорее всего, левое соединение в базе данных, что столбцы возвращаются в DBNull просто потому, что они фактически не были в базе данных. Я бы посоветовал вам выполнить SELECT * FROM Необязательно, где ID = независимо от asle.Id.

+0

Нет предложения asle.id where в запросе EF. Я просто запускал SQL-запрос (присоединение к двум таблицам) непосредственно против db, и он работает нормально. – pQuestions123

+0

Значит, каждый ответSymlectListEntries имеет соответствующую опцию в таблице соединений? Если нет, и вы выполняете внешнее соединение вместо внутреннего соединения, которое похоже на этот запрос LINQ, поведение, которое вы видите, ожидается в некоторых случаях. Это кажется особенно вероятным, потому что его название подразумевает, что оно фактически является необязательным. – jamesbascle

+0

Да, вы правы. Мне нужно учесть необязательный == null. Это исправило это. – pQuestions123

Смежные вопросы