Entity framework core 是否可以在EF Core 3.1中的每个层次结构表上调用表上的存储过程?

Entity framework core 是否可以在EF Core 3.1中的每个层次结构表上调用表上的存储过程?,entity-framework-core,table-per-hierarchy,Entity Framework Core,Table Per Hierarchy,我正在从EF Core 2.2升级到3.1。是因为它不再由存储过程组成,所以您必须添加“AsEnumerable”。这通常是可行的,但我在TPH表上有一个存储过程调用,但失败了: 我对存储过程的呼吁是: SqlParameter authorizedUserID_p = new SqlParameter("@authorizedUserID", authorizedUser.ID); IEnumerable<Post> query =

我正在从EF Core 2.2升级到3.1。是因为它不再由存储过程组成,所以您必须添加“AsEnumerable”。这通常是可行的,但我在TPH表上有一个存储过程调用,但失败了:

  • 我对存储过程的呼吁是:

     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>();
    
    SqlParameter authorizedUserID\u p=
    新的SqlParameter(“@authorizedUserID”,authorizedUser.ID);
    IEnumerable查询=
    context.Posts.FromSqlRaw(“Post.USP_ReadPost@ID,@AuthorizedUserID”,
    参数:new[]{parentID\u p,authorizedUserID\u p}
    ).AsEnumerable();
    Post targetPost=query.ToList().FirstOrDefault();
    
  • 它产生了这个错误,建议使用asenumber(我已经在上面使用了):

    System.InvalidOperationException:使用不可组合的SQL调用了FromSqlRaw或FromSqlInterpolated,并在其上组合了一个查询。 考虑调用“代码> >可枚举的< /代码>,在FROXSLBRAW或FROSQLILIDATION方法之后在客户端执行组合。

  • 我相信原因是因为我的Posts表是table per hierarchy,因为在同一个应用程序中对存储过程的其他调用工作正常。如有任何可能,我们将不胜感激


  • 这是EFC 3引入的另一个问题,由跟踪

    原因是SP调用不可组合,EF Core总是尝试为TPH基本实体组合SQL,以便添加鉴别器条件。与全局查询过滤器类似,但在这里您至少可以使用
    IgnoreQueryFilters
    ,而在这里您没有选择

    好消息是,它已经在EFC存储库中修复。坏消息是它要到EFC5.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})”;Post targetPost=targetPosts.FirstOrDefault();我的UDF和我的存储过程基本上是一样的,就像一个UDF。注意,我必须在TVF返回表中包含鉴别器列,尽管它显然不在我的Post实体中,因为EF希望嵌套select中的每一列都存在。你们都有一个例子,因为我不理解这个…嗨@Ortund,你们真的需要理解吗?这对于和的EF核心实现非常具体。