Исключение при попытке выполнить хранимую процедуру в ASP.NET MVC с помощью Sql-запроса
Я работаю с Entity Framework, но у меня есть иерархический источник данных. Для выполнения db-запросов и преобразования в json в контроллере требуется слишком много времени.
По этой причине у меня есть хранимая процедура.
Выполняя хранимую процедуру непосредственно в Microsoft SQL Server Management Studio, я получаю ожидаемый результат.
Но попытка сделать следующее в моем контроллере выдает следующее исключение.
`IEnumerable<MyItem> itemsJson=Context.Database.SqlQuery<MyItem>("Get_JSON_MyItems").ToList();`
System.Data.Entity.Core.EntityCommandExecutionException: "Средство чтения данных несовместимо с указанным" MyDataModel.MyItem ". Элемент типа "Id" не имеет соответствующего столбца в считывателе данных с тем же именем. '
Я думаю, что читатель данных разбивает строку на много полей, потому что это слишком долго? Но я не уверен и не знаю, как бы я это исправить, если так.
-
(Также попытался написать команду в контроллере вместо выполнения хранимой процедуры)
1 ответ
FOR JSON
приводит к тому, что запрос возвращает одну строку и один столбец с бессмысленным именем столбца (по сути, одну ячейку, содержащую всю полезную нагрузку JSON). Как пример - у него нет Id
столбец в нем - поэтому EF не знает, как заполнить модель.
Я бы посоветовал вам:
- Удалить использование
FOR JSON
, - Убедитесь, что столбцы, возвращаемые в запросе, точно такие же, как свойства в вашем классе. Попробуйте только если (1) не работает.
В качестве альтернативы, если вы действительно хотите сохранить FOR JSON
Затем вам нужно прочитать один элемент JSON, а затем использовать JSON.NET (или аналогичный), чтобы сопоставить его с вашим List<MyItem>
,
Например, один из способов сделать это - изменить хранимый процесс на nvarchar(MAX) OUTPUT
параметр - который вы устанавливаете на результат вашего запроса. Ваш вызывающий код может затем прочитать этот выходной параметр.
Другим способом было бы вообще обойти Entity Framework и напрямую использовать ADO.NET. Вызовите сохраненный процесс и затем используйте SqlDataReader.GetString(0)
чтобы получить сырой JSON.