gpt4 book ai didi

entity-framework-core - EFCore 3.1 FromSqlRaw 不工作并抛出奇怪的错误消息

转载 作者:行者123 更新时间:2023-12-05 05:02:26 25 4
gpt4 key购买 nike

我遇到了 EF Core 3.1 最奇怪的问题。在 EF Core 2.2 中,我曾经能够执行存储过程。我看到文档中有重大更改,但我完全按照文档进行操作,但它不起作用。我在返回的数据中的任何地方都没有空值。 NoticeOfInspection 对象与返回的数据完全匹配。他们到底做了什么改变,导致这不起作用?

var data = _dbContext.NoticeOfInspections.FromSqlRaw("EXEC dbo.NewReportApp_NoticeOfInspection {0}", FacilityId).Single();

错误消息根本没有帮助。首先是上面的行,它说,“InvalidOperationException:FromSqlRaw 或 FromSqlInterpolated 是用不可组合的 SQL 调用的,并在其上组合了一个查询。考虑在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用 AsEnumerable 来执行组合在客户端。”

什么?

因此,我添加了 AsEnumerable,然后它抛出“InvalidCastException:无法将‘System.Int32’类型的对象转换为‘System.String’类型。”

他们到底做了什么。这根本不直观。

最佳答案

FromSqlRaw or FromSqlInterpolated was called with non-composable SQL

不可组合的 SQL 是无法转换为子查询 select * from (your_sql) 的 SQL。调用 SP (EXEC …) 是不可组合的结构之一。

and with a query composing over it

非查询返回 LINQ 运算符,如 SingleFirstCountMaxSum 等需要对提供的 SQL 查询进行组合,例如 select count * from (your_query)

您可以在 Raw SQL queries - Composing with LINQ 中阅读更多相关信息文档主题,其中还包含“调用 SP”和其他限制/限制:

Composing with LINQ requires your raw SQL query to be composable since EF Core will treat the supplied SQL as a subquery. SQL queries that can be composed on begin with the SELECT keyword. Further, SQL passed shouldn't contain any characters or options that aren't valid on a subquery, such as:

  • A trailing semicolon
  • On SQL Server, a trailing query-level hint (for example, OPTION (HASH JOIN))
  • On SQL Server, an ORDER BY clause that isn't used with OFFSET 0 OR TOP 100 PERCENT in the SELECT clause

SQL Server doesn't allow composing over stored procedure calls, so any attempt to apply additional query operators to such a call will result in invalid SQL. Use AsEnumerable or AsAsyncEnumerable method right after FromSqlRaw or FromSqlInterpolated methods to make sure that EF Core doesn't try to compose over a stored procedure.

话虽如此,在 Single() 之前插入 AsEnumerable() 应该确实有效。

您得到的新异常是 EF Core 错误或数据类型映射问题(您将 int 传递给 string 参数,或者 SP 正在返回 int 用于 string 类属性)。您需要检查异常堆栈跟踪和/或将您的 SP 参数和列类型与 FacilityId 参数类型和 NoticeOfInspection 类属性类型/映射进行比较。

关于entity-framework-core - EFCore 3.1 FromSqlRaw 不工作并抛出奇怪的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62184175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com