Чтение данных несовместимо... член не имеет соответствующего столбца в считывателе данных

Используя VS 2008, SQL Server 2008 и WPF 3.5, я внесла некоторые изменения в мою схему и обновил модель. Он компилируется и работает нормально, пока клиентское приложение не потребует определенного объекта, и я получаю следующее (заменены фактические имена):

The data reader is incompatible with the specified '<Model>.<ViewBasedEntity>'. A member of the type, '<Property>', does not have a corresponding column in the data reader with the same name.

Я искал в приложении служб для связанных имен объектов и свойств, пробовал переименование свойств в Табличной карте. Кажется, что многие другие там сообщают о той же ошибке, но не могут найти своевременного ответа....

... Кто-нибудь знает, как отслеживать это, и если да, то есть ли в будущем исправление или методология, чтобы избежать этого?

Ответ 1

Вместо обновления представления вы также можете обновить функцию Import:

  • Перейдите в окно браузера модели
  • Развернуть EntityContainer
  • Откройте "Импорт функций" в окне "Детали отображения"
  • Если имя объекта (левый столбец) не соответствует ожидаемому имени поля (правый столбец), вы можете изменить правый столбец, чтобы он соответствовал тому, что фактически вызывается возвращаемое поле.

Ответ 2

У меня была аналогичная проблема, вызвавшая такое же сообщение об ошибке - проблема заключалась в том, что имя столбца, возвращаемое proc, включало пробел.

При создании сложного типа [my column] был создан как my_column.

Тогда при выполнении proc с ExecuteStoreQuery, my_column не было в считывателе данных, поскольку proc все еще возвращал [my column].

Решение: удалите пробел из имени столбца proc и воссоздайте свой сложный тип для импортируемой функции.

Ответ 3

Хорошо - здесь тощий:

Это конкретное представление было настроено как тип возврата для хранимой процедуры, которую нужно было настроить как импорт функции в контейнере модели объекта.

Я обновил это представление для соответствия новым требованиям к отчетности, не понимая его значимости для импорта функций. Дополнительные поля не являются частью набора данных, распознанного для этой цели, поэтому он не мог найти соответствия ни для одного из них.

Итак, я продублировал представление и суффиксом его с помощью "Отчет", а затем вернул исходный код обратно к ожидаемому набору полей возврата.

Voila!

Ответ 4

Пожалуйста, отметьте это сообщение в блоге. Проверьте первый комментарий Дивана Моллера. Возможно, вам будет полезно.

Ответ 5

Я видел, как это происходит с объектами данных, которые изменяют набор результатов (например, sproc с оператором if). Сообщение об ошибке - это работа с объектной картой/программа чтения данных, сообщающая вам, что она ожидала столбца x и не была возвращена.

Чтобы обойти это, вы можете либо a) Убедитесь, что все пути вашего sproc возвращают одинаковые имена столбцов b) Использовать Database.ExecuteSqlCommand

Ответ 6

Я столкнулся с той же проблемой при использовании Sprocs в последнее время. У меня был некоторый conditonal SQL в sproc по строкам нескольких инструкций "if"

IF @param1 = 'knownValue'
BEGIN
SELECT * FROM EntityType WHERE ID = 'somevalue'
END
ELSE IF @param1 = 'knownValue2'
BEGIN
SELECT * FROM EntityType WHERE ID = 'somevalue'
END

здесь мой EF-код:

return context.Database.SqlQuery<EntityType>(
            "[NAV].[GeEntityType] @Date, @ID",
            new SqlParameter("Date", paramDate),
            new SqlParameter("ID", paramId)).ToList();

Я не рассматривал сценарии, где ни одно из операторов if не возвращалось, поэтому sproc даже не возвращал пустой набор результатов и заставлял EF выкидывать эту ошибку. Не возвращая даже пустой читатель, EF не мог сопоставлять столбцы со свойствами.

Надеюсь, что это поможет.

Ответ 7

Простой способ:

  • После того, как SP будет полностью обновлен EF Model, он будет доступен.
  • Добавить инструкцию PRINT в SP, перекомпилировать и запустить.
  • Комментарий Dynamic SQL и добавьте инструкцию PRINT, перекомпилируйте ее, чтобы она выполнялась.
  • Теперь импортируйте функцию в EF, столбцы покажут.
  • Смените SP на Dynamic code и все хорошо:)