我最近从 EF Core 2.2 迁移到了 EF Core 3.0。
不幸的是,我还没有找到调用返回实体的存储过程的方法。
在 EF Core 2.0 中,这是可能的:
var spParams = new object[] { "bla", "xx" };
var createdPath = ModelContext.Paths.FromSql("AddNodeWithPathProc @p0, @p1", spParams).Single();
在 EF Core 3.0 中,方法 FromSQL
被替换为 FromSqlRaw
。但是,我没有设法成功调用存储过程然后处理该值。当存储过程将数据插入数据库时,这很有用。
所以在 EF Core 3.0 中,我使用了这段代码:
var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc @p0, @p1", spParams).Single();
但是它会抛出异常,因为生成的 SQL 是无效的,看起来像这样:
exec sp_executesql N'SELECT TOP(2) [p].[PathId], [p].[Level], [p].[NodeId], [p].[NodePath], [p].[NodePathString]
FROM (
@sql @p0, @p1
) AS [p]',N'@p0 nvarchar(4000),@p1 nvarchar(4000), @sql nvarchar(100)',@p0=N'1a',@p1=N'', @sql=N'AddNodeWithPathProc'
我尝试了很多变体,但没有成功。
我开始认为不可能使用 ModelContext.[IQueryable].FromSqlRaw
运行存储过程。在我看来,这种类型打败了 FromSqlRaw
的主要原因之一,因为对于普通的 select 语句,LINQ 通常已经足够好了。
有谁知道如何在 EF Core 3.0 中结合使用存储过程和 FromSqlRaw
?非常感谢任何帮助。
提前致谢
PS:我知道您可以使用 this.Database.ExecuteSqlRaw(SQL, parameters)
执行存储过程。但是,这样就不可能检索存储过程查询的任何实体。
最佳答案
解决方案(感谢 David Browne,您应该将其作为答案发布):
用 ToList 替换 Single 有效 :-)
var createdPath = ModelContext.Paths.FromSqlRaw("AddNodeWithPathProc {0}, {1}", nodeTitle, parentPathString).ToList();
关于c# - 如何通过 FromSqlRaw 调用 EF Core 3.0 中的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58207182/