На прошлой неделе мы столкнулись со странной проблемой при разработке нового проекта для некоторых внутренних целей.Мы используем хранимую процедуру в базе данных SQL Azure для получения некоторых данных.Затем Entity Framework для сопоставления базы данных с моделью контекста службы данных.Затем это отображается как служба OData, шаблон и т. Д. И т. Д. *
. От клиента мы получаем такие результаты:
OurDataServiceContext.Execute<OurResultsModel>(oDataQueryUri, "GET", false);
Ничего особенного или интересного здесь нет.Фактически, идентичный код можно найти в другом месте нашего проекта.Однако в этом случае исключение будет происходить всякий раз, когда перечисляются результаты QueryOperationResponse.
System.InvalidCastException: 'Unable to cast object of type 'System.String' to type 'OurResultsModel'
Это поставило меня в тупик и двух других членов команды.Имейте в виду, что в хранимой процедуре нет ничего плохого: мы можем выполнить ее и получить ожидаемые результаты.Также ничего не пошло не так с самой службой OData: запросы Fiddler, запросы браузера - нет проблем!В конце концов я создал новый класс «OurResultsModel2», а затем:
OurDataServiceContext.IgnoreMissingProperties = true;
OurDataServiceContext.Execute<OurResultsModel2>(oDataQueryUri, "GET", false);
Я намеревался удалить свойства, пока он не заработал.К счастью, мне удалось перечислить результаты с первой попытки.Я также смог скопировать InvalidCastException с этим типом.Итак, вот мой вопрос: что?Что в мире я только что сделал, чтобы это исправить?
Еще несколько деталей ...
Наша хранимая процедура выглядит примерно так ...
SELECT mt.ID AS ID, mc.Qty AS MorningCount,
[...another couple of nullable int columns, and a descriptive string...]
FROM [...a derived table grouped by mt.ID...]
Мы изменили «mt.ID AS ID» на «mt»..ID AS MealID "и все было хорошо.Итак, что опять?Кажется, я не могу найти ни одного правила, которое говорит «не называйте столбец идентификатора хранимой процедуры» по отношению к WCF, OData или EntityFramework.Я не могу найти ни одно задокументированное правило, или - в этом отношении - любые подобные проблемы здесь или любые другие форумыТак что, вероятно, я что-то неправильно понимаю.И определенно есть кое-что, чего я не знаю.
Надеюсь, кто-нибудь поможет мне разобраться!