【发布时间】:2019-10-02 18:19:12
【问题描述】:
我最近从 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 的主要原因之一,因为对于普通的选择语句,LINQ 通常足够好。
有谁知道如何在 EF Core 3.0 中结合使用存储过程和 FromSqlRaw?非常感谢任何帮助。
提前致谢
PS:我知道您可以使用this.Database.ExecuteSqlRaw(SQL, parameters) 执行存储过程。但是,这样就无法检索存储过程查询的任何实体。
【问题讨论】:
-
尝试 .ToList() 而不是 .Single()。 .Single() 正在生成“TOP(2)”包装器。
-
我暂时的解决方法如下:this.ModelContext.ExecuteRawSql("EXEC AddNodeWithPathProc @p0, @p1", spParams); var createdPath = ModelContext.Paths.FromSqlRaw("SELECT TOP 1 * FROM dbo.Path ORDER BY PathID DESC").Single();但是,这不是一个可接受的生产解决方案。
-
是的.. ToList() 有效.. 非常感谢 :-)
标签: c# entity-framework entity-framework-core .net-core-3.0