Entity framework core SqlRaw中的EFCore 3.1不工作,并抛出一条奇怪的错误消息

Entity framework core SqlRaw中的EFCore 3.1不工作,并抛出一条奇怪的错误消息,entity-framework-core,Entity Framework Core,我对EF Core 3.1有一个最奇怪的问题。在EFCore2.2中,我曾经能够执行存储过程。我看到文档中有一个突破性的变化,但是,我完全遵循文档,它不起作用。返回的数据中没有空值。NoticeOfInspection对象与返回的数据完全匹配。他们到底改变了什么,以至于这不起作用 var data = _dbContext.NoticeOfInspections.FromSqlRaw("EXEC dbo.NewReportApp_NoticeOfInspection {0}", Facility

我对EF Core 3.1有一个最奇怪的问题。在EFCore2.2中,我曾经能够执行存储过程。我看到文档中有一个突破性的变化,但是,我完全遵循文档,它不起作用。返回的数据中没有空值。NoticeOfInspection对象与返回的数据完全匹配。他们到底改变了什么,以至于这不起作用

var data = _dbContext.NoticeOfInspections.FromSqlRaw("EXEC dbo.NewReportApp_NoticeOfInspection {0}", FacilityId).Single();
错误消息根本没有帮助。首先,用上面的一行说,“无效的操作异常:FasSQLFRAW或OFSSQLIdEnter是用不可组合的SQL调用的,并由它组成一个查询。考虑在OFFSQLRAW或OFFSQLIFIDE方法之后调用调用<代码>可枚举的< /代码>,以在客户端执行组合。” 什么

因此,我添加了一个numerable,然后它抛出,“InvalidCastException:无法将'System.Int32'类型的对象强制转换为'System.String'类型。”

他们到底做了什么。这完全不是直觉

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

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

并在其上生成一个查询

非查询返回LINQ运算符,如
Single
First
Count
Max
Sum
等,需要在提供的SQL查询上进行组合,例如
从(您的_查询)中选择Count*

您可以在文档主题中了解更多信息,该主题还包含“调用SP”和其他限制/限制:

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

  • 尾随分号
  • 在SQL Server上,后面的查询级别提示(例如,
    OPTION(HASH JOIN))
  • 在SQL Server上,一个
    ORDER BY
    子句,它不与
    SELECT
    子句中的
    偏移量0
    最高100%
    一起使用
SQL Server不允许在存储过程调用上进行组合,因此任何对此类调用应用其他查询运算符的尝试都将导致SQL无效。使用
AsEnumerable
assyncenumerable
方法,在
FromSqlRaw
FromSqlInterpolated
方法之后立即使用,以确保EF核心不会试图在存储过程上进行组合

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


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

出于某些奇怪的原因,我的键不能是字符串。我不明白使用字符串作为键会有什么问题,但EF Core肯定对此不满意。我是否使用[Key]元数据并不重要。我一开始就必须有一个存储过程的密钥,这一点都没有意义。EF在尽可能简单的任务上失败了——将数据从SQL映射到对象。它肯定允许字符串和键。此外,如果类映射为,它根本不需要键。但您似乎有数据类型差异。顺便说一句,将数据从原始SQL映射到对象并不是EF的主要目标——还有很多其他库(如Dapper)可以做到这一点。无论如何,我认为所有这些都超出了原始问题的范围,即SqlRaw的EFCore 3.1不起作用,并抛出了一条奇怪的错误消息,我相信这里已经给出了答案。这很公平。您提供了答案,尽管我已经读了三遍,但都是完全相同的文档没有解决我的问题。如果没有名为Id的字段,并且在Key属性上使用[Key]数据注释,则会出现错误。我应该包括映射类。@tnk479我从不排除遇到EF核心错误的可能性(他们有很多)。但是如果实际问题是插入
AsEnumerable()
后出现的异常,那么您应该集中精力解决这个问题-正如您所说,包括映射类和fluent配置等。如果您愿意,您可以发布另一个包含这些详细信息的问题,我很乐意查看。