是否可以在 EF Core 3.1 中的 Table-Per-Hierarchy 表上调用存储过程?

2023-12-12

我将从 EF Core 2.2 迁移到 3.1。一项重大变更 (#15392)是它不再由存储过程组成,因此您必须添加“AsEnumerable”。这通常有效,但我在 TPH 表上有一个存储过程调用,但失败了:

  1. 我对 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>();
    
  2. 它会产生此错误,建议使用 AsEnumberable (我上面已经使用过):

    System.InvalidOperationException:使用不可组合的 SQL 和在其上组合的查询调用了 FromSqlRaw 或 FromSqlInterpolated。 考虑打电话AsEnumerable在 FromSqlRaw 或 FromSqlInterpolated 方法之后在客户端执行合成。

  3. 我相信原因是因为我的 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(使用前将#替换为@)

是否可以在 EF Core 3.1 中的 Table-Per-Hierarchy 表上调用存储过程? 的相关文章

随机推荐