Исключение при попытке выполнить хранимую процедуру в 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 не знает, как заполнить модель.

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

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

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

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

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

Другие вопросы по тегам