可以在 EF Core 3.1 中的 Table-Per-Hierarchy table 上调用存储过程吗?
Possible to call a stored procedure on a Table-Per-Hierarchy table in EF Core 3.1?
我正在从 EF Core 2.2 迁移到 3.1。 One breaking change (#15392) 是它不再组合存储过程,所以你必须添加 'AsEnumerable'。这通常有效,但我在 TPH table 上有一个存储过程调用失败了:
我对 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:调用 FromSqlRaw 或 FromSqlInterpolated 时使用了不可组合的 SQL 并在其上组合了查询。
考虑在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用 AsEnumerable
以在客户端执行组合。
我认为原因是因为我的帖子 table 是 Table-per-hiearchy,因为同一应用程序中对 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(table 值函数)。通常,对于非查询返回调用(与 ExecuteSql*
一起执行)使用带有输出参数的标量函数或存储过程,对于单个查询返回调用(与一起使用)使用 table 值函数FromSql*
)。请注意,目前 EFC 无论如何都不支持多查询返回存储过程。
我正在从 EF Core 2.2 迁移到 3.1。 One breaking change (#15392) 是它不再组合存储过程,所以你必须添加 'AsEnumerable'。这通常有效,但我在 TPH table 上有一个存储过程调用失败了:
我对 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:调用 FromSqlRaw 或 FromSqlInterpolated 时使用了不可组合的 SQL 并在其上组合了查询。 考虑在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用
AsEnumerable
以在客户端执行组合。我认为原因是因为我的帖子 table 是 Table-per-hiearchy,因为同一应用程序中对 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(table 值函数)。通常,对于非查询返回调用(与 ExecuteSql*
一起执行)使用带有输出参数的标量函数或存储过程,对于单个查询返回调用(与一起使用)使用 table 值函数FromSql*
)。请注意,目前 EFC 无论如何都不支持多查询返回存储过程。