Entity framework core 是否可以在EF Core 3.1中的每个层次结构表上调用表上的存储过程?
我正在从EF Core 2.2升级到3.1。是因为它不再由存储过程组成,所以您必须添加“AsEnumerable”。这通常是可行的,但我在TPH表上有一个存储过程调用,但失败了: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 =
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();
这是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核心实现非常具体。