EFCore 3.1 FromSqlRaw无法正常工作并引发奇怪的错误消息

时间:2020-06-03 23:05:28

标签: entity-framework-core

我最担心EF Core 3.1的问题。在EF Core 2.2中,我曾经能够执行存储过程。我看到文档中有一个重大更改,但是我正在完全遵循文档,因此无法正常工作。我在返回的数据中的任何地方都没有null。 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'的情况。”

他们在地球上做了什么。这一点都不直观。

1 个答案:

答案 0 :(得分:0)

FromSqlRaw或FromSqlInterpolated是使用不可组合的SQL调用的

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

,并有一个组成查询的查询

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

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

使用LINQ进行编写要求您的原始SQL查询必须是可组合的,因为EF Core会将提供的SQL视为子查询。可以组成的SQL查询以SELECT关键字开头。此外,传递的SQL不应包含对子查询无效的任何字符或选项,例如:

  • 尾部分号
  • 在SQL Server上,尾随查询级提示(例如OPTION (HASH JOIN))
  • 在SQL Server上,未与ORDER BY子句中的OFFSET 0TOP 100 PERCENT一起使用的SELECT子句

SQL Server不允许通过存储过程调用进行组合,因此,任何将附加查询运算符应用于此类调用的尝试都将导致无效的SQL。在AsEnumerableAsAsyncEnumerable方法之后立即使用FromSqlRawFromSqlInterpolated方法,以确保EF Core不会尝试对存储过程进行组合。

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

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