Чтение данных несовместимо... член не имеет соответствующего столбца в считывателе данных
Используя 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 и все хорошо:)