Исключение при попытке выполнить хранимую процедуру в ASP.NET MVC с помощью Sql-запроса - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю с Entity Framework, но у меня есть иерархический источник данных.Выполнение db-запросов и преобразование в json в контроллере занимает слишком много времени.

По этой причине у меня есть хранимая процедура.

Выполнение хранимой процедуры непосредственно в Microsoft SQL ServerManagement Studio, я получаю ожидаемый вывод.

Но при попытке сделать следующее в моем контроллере выдается следующее исключение.

  `IEnumerable<MyItem> itemsJson=Context.Database.SqlQuery<MyItem>("Get_JSON_MyItems").ToList();` 

System.Data.Entity.Core.EntityCommandExecutionException: «Средство чтения данных несовместимо с указанным« MyDataModel.MyItem ».Элемент типа «Id» не имеет соответствующего столбца в считывателе данных с тем же именем. '

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

-

(также пытался написать команду в контроллере вместо выполнения хранимой процедуры)

1 Ответ

0 голосов
/ 16 ноября 2018

FOR JSON приводит к тому, что запрос возвращает одну строку и один столбец с бессмысленным именем столбца (по сути, это одна ячейка, содержащая всю полезную нагрузку JSON). В качестве примера - в нем нет столбца Id, поэтому EF не знает, как заполнить модель.

Я бы посоветовал вам:

  1. Удалить использование FOR JSON.
  2. Убедитесь, что столбцы, возвращаемые в запросе, точно совпадают со свойствами в вашем классе. Попробуйте только если (1) не работает.

В качестве альтернативы, если вы действительно хотите сохранить FOR JSON, то вам нужно прочитать один элемент JSON и затем использовать JSON.NET (или аналогичный), чтобы сопоставить его с вашим List<MyItem>.

Один из способов сделать это, например, изменить свой сохраненный процесс на параметр nvarchar(MAX) OUTPUT, который вы задаете в качестве результата своего запроса. Ваш вызывающий код может затем прочитать этот выходной параметр.

Другим способом было бы вообще обойти Entity Framework и напрямую использовать ADO.NET. Вызовите сохраненный процесс и затем используйте SqlDataReader.GetString(0), чтобы получить необработанный JSON.

...