【问题标题】:Possible to call a stored procedure on a Table-Per-Hierarchy table in EF Core 3.1?可以在 EF Core 3.1 中的 Table-Per-Hierarchy 表上调用存储过程吗?
【发布时间】:2020-07-19 02:36:16
【问题描述】:

我正在从 EF Core 2.2 迁移到 3.1。 One breaking change (#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:FromSqlRaw 或 FromSqlInterpolated 是使用不可组合的 SQL 调用的,并且查询在其上进行组合。 考虑在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用 AsEnumerable 在客户端执行合成。

  3. 我相信原因是因为我的 Posts 表是 Table-per-hiearchy,因为在同一应用程序中对 SPROCS 的其他调用工作正常。将不胜感激任何可能的帮助!

【问题讨论】:

    标签: entity-framework-core table-per-hierarchy


    【解决方案1】:

    这是 EFC 3 引入的另一个问题,由 #18232: Impossible to use stored procedures related to entities that inherits another one 跟踪。

    原因是 SP 调用不可组合,EF Core 总是尝试为 TPH 基础实体组合 SQL 以添加鉴别条件。类似于 Global Query Filters,但在那里你至少可以使用IgnoreQueryFilters,而在这里你没有选择。

    好消息是它已经在 EFC 存储库中修复。坏消息是它要等到 EFC 5.0 才会发布。

    既然AsEnumerable()没有用,你只能等待EFC 5.0。或者,如果可能,将这样的 SP 转换为可组合的 TVF(表值函数)。一般来说,对于非查询返回调用(与ExecuteSql* 一起执行)使用带有输出参数的标量函数或存储过程,对单个查询返回调用(与FromSql* 一起使用)使用表值函数。请注意,目前 EFC 不支持返回存储过程的多个查询。

    【讨论】:

    • 很好的答案,至少这是一个明确的“不”。我可以使用它。 :)
    • 成功了,仅供他人参考,这是我使用的 TVF 调用,(Post 是我的实体类): IEnumerable targetPosts = context.Posts.FromSqlInterpolated($"SELECT * FROM Post. UDF_MY_TVF({id},{authorizedUser.ID})");发布 targetPost = targetPosts.FirstOrDefault();我的 UDF 基本上和我的 sproc 完全一样,就像一个 UDF。需要注意的是,我实际上必须在 TVF 返回表中包含 Discriminator 列,即使它显然不在我的 Post 实体中,因为 EF 期望嵌套选择中的每一列都存在。
    • 你们有一个例子,因为我不明白这个......
    • 嗨@Ortund,你真的需要了解它吗?它非常特定于 Database InheritanceRaw SQL Queries 的 EF Core 实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多