我将从 EF Core 2.2 迁移到 3.1。 One breaking change (#15392)是它不再由存储过程组成,因此您必须添加“AsEnumerable”。这通常有效,但我在 TPH 表上有一个存储过程调用,但失败了:
我对 SPROC 的调用是:
SqlParameter authorizedUserID_p = new SqlParameter("@authorizedUserID", authorizedUser.ID); IEnumerable<Post> query = context.Posts.FromSqlRaw<Post>("Post.USP_ReadPost @ID, @AuthorizedUserID", parameters: new[]{ parentID_p, authorizedUserID_p } ).AsEnumerable<Post>(); Post targetPost = query.ToList<Post>().FirstOrDefault<Post>();
它会产生此错误,建议使用 AsEnumberable (我上面已经使用过):
System.InvalidOperationException:使用不可组合的 SQL 和在其上组合的查询调用了 FromSqlRaw 或 FromSqlInterpolated。 请考虑在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用
AsEnumerable
以在客户端执行组合。我相信原因是因为我的 Posts 表是按层次结构表,因为同一应用程序中对 SPROCS 的其他调用工作正常。如果有任何帮助,我们将不胜感激!
最佳答案
这是 EFC 3 引入的另一个问题,由 #18232: Impossible to use stored procedures related to entities that inherits another one 跟踪.
原因是 SP 调用不可组合,并且 EF Core 总是尝试为 TPH 基本实体组合 SQL 以添加鉴别器条件。与全局查询过滤器类似,但在那里你至少可以使用IgnoreQueryFilters
,而在这里你没有选择。
好消息是它已经在 EFC 存储库中修复。坏消息是它要到 EFC 5.0 才会发布。
由于 AsEnumerable()
没有帮助,您所能做的就是等待 EFC 5.0。或者,如果可能的话,将这样的 SP 转换为可组合的 TVF(表值函数)。一般来说,使用带有输出参数的标量函数或存储过程进行非查询返回调用(使用 ExecuteSql* 执行),使用表值函数进行单个查询返回调用(使用FromSql*
)。请注意,目前 EFC 无论如何都不支持多个查询返回存储过程。
关于entity-framework-core - 是否可以在 EF Core 3.1 中的 Table-Per-Hierarchy 表上调用存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61070935/