-2

我正在使用实体框架,但有一个分层数据源。在控制器中进行 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中写命令而不是执行存储过程)

4

1 回答 1

0

FOR JSON导致查询返回单行单列,列名无意义(本质上是包含完整 JSON 有效负载的单个单元格)。例如 - 它没有Id列 - 所以 EF 不知道如何填充模型。

我建议你需要:

  1. 删除使用FOR JSON.
  2. 确保查询中返回的列与您的类中的属性完全相同。仅在 (1) 不起作用时尝试此操作。

FOR JSON或者,如果您真的想保留List<MyItem>.

例如,您可以执行此操作的一种方法是将存储的过程更改为具有nvarchar(MAX) OUTPUT参数 - 您将其设置为查询结果。然后,您的调用代码可以读取该输出参数。

另一种方法是完全绕过实体框架并直接使用 ADO.NET。调用存储的过程,然后用于SqlDataReader.GetString(0)获取原始 JSON。

于 2018-11-16T10:49:00.067 回答