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

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

我将从 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:使用不可组合的 SQL 和在其上组合的查询调用了 FromSqlRaw 或 FromSqlInterpolated。 请考虑在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用 AsEnumerable 以在客户端执行组合。

  3. 我相信原因是因为我的 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/

相关文章:

c# - 未找到命令 dotnet ef

hibernate - 从一个子类更改为另一个子类的最聪明方法(更新鉴别器值)

c# - EF Core Fluent API 配置防止 TPC 继承

c# - 同一基类的 EF Core、每个层次结构表和引用实体生成错误

c# - 使用 TPH 的 Entity Framework 多级继承

inheritance - EF4.1 Exception creating Database with table-per-hierarchy 继承

c# - 如何在不包含/加载整个集合的情况下获取 Entity Framework 模型中列表的计数?

c# - 尝试使用字符串变量进行 SetPropertyCall 时,ExecuteUpdate 拦截器崩溃

c# - 如何为 EF Core 创建可重用的 'Contains' 表达式