c# - 尝试使用 Sql-Query 在 ASP.NET MVC 中执行存储过程时出现异常
问题描述
我正在使用实体框架,但有一个分层数据源。在控制器中进行 db-queries 并转换为 json 需要很长时间。
出于这个原因,我有一个存储过程。
直接在 Microsoft SQL Server Management Studio 中执行存储过程,我得到了预期的输出。
但是尝试在我的 Controller 中执行以下操作会引发以下异常。
`IEnumerable<MyItem> itemsJson=Context.Database.SqlQuery<MyItem>("Get_JSON_MyItems").ToList();`
System.Data.Entity.Core.EntityCommandExecutionException: '数据读取器与指定的 'MyDataModel.MyItem' 不兼容。类型的成员“Id”在数据读取器中没有同名的对应列。
我猜数据阅读器将字符串拆分为许多字段,因为它太长了?但我不确定,也不知道如果是这样我会如何解决。
--
(也尝试在Controller中写命令而不是执行存储过程)
解决方案
FOR JSON
导致查询返回单行单列,列名无意义(本质上是包含完整 JSON 有效负载的单个单元格)。例如 - 它没有Id
列 - 所以 EF 不知道如何填充模型。
我建议你需要:
- 删除使用
FOR JSON
. - 确保查询中返回的列与您的类中的属性完全相同。仅在 (1) 不起作用时尝试此操作。
FOR JSON
或者,如果您真的想保留List<MyItem>
.
例如,您可以执行此操作的一种方法是将存储的过程更改为具有nvarchar(MAX) OUTPUT
参数 - 您将其设置为查询结果。然后,您的调用代码可以读取该输出参数。
另一种方法是完全绕过实体框架并直接使用 ADO.NET。调用存储的过程,然后用于SqlDataReader.GetString(0)
获取原始 JSON。