我将从 EF Core 2.2 迁移到 3.1。一项重大变更 (#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。
考虑打电话AsEnumerable
在 FromSqlRaw 或 FromSqlInterpolated 方法之后在客户端执行合成。
我相信原因是因为我的 Posts 表是每个层次结构表,因为同一应用程序中对 PROCEDURE 的其他调用工作正常。将不胜感激任何可能的帮助!
这是 EFC 3 引入的另一个问题,由#18232:无法使用与继承另一个实体相关的存储过程.
原因是 SP 调用不可组合,并且 EF Core 总是尝试为 TPH 基本实体组合 SQL 以添加鉴别器条件。类似于全局查询过滤器,但你至少可以使用IgnoreQueryFilters
,而在这里你别无选择。
好消息是它已经在 EFC 存储库中修复。坏消息是它要到 EFC 5.0 才会发布。
Since AsEnumerable()
没有帮助,你所能做的就是等待EFC 5.0。或者,如果可能的话,将这样的 SP 转换为可组合的 TVF(表值函数)。一般来说,使用标量函数或带有输出参数的存储过程进行非查询返回调用(使用ExecuteSql*
),以及用于单个查询返回调用的表值函数(与FromSql*
)。请注意,目前 EFC 无论如何都不支持多个查询返回存储过程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)