【问题标题】:Getting one from Entity Framework Core calling a stored procedure从 Entity Framework Core 获取一个调用存储过程
【发布时间】:2020-12-31 05:11:26
【问题描述】:

我正在尝试使用 Entity Framework Core 调用存储过程。存储过程有点复杂,所以我没有使用 LINQ。

这是我的代码:

using (IdentityProofContext dc =  new IdentityProofContext())
{
    SqlParameter[] @params =
        {
            new SqlParameter("@result", SqlDbType.Int) {Direction = ParameterDirection.Output}
        };


    dc.IdentityPersonalData.FromSqlRaw("Execute usp_GetIdentityProofStatus", @params).FirstOrDefaultAsync();

    //var result = @params[0].Value;
    //if (result > 0)
    //{
    //    MiscEmails.sendEmails();
    //}
}

这是我的存储过程:

ALTER PROCEDURE usp_GetStatus
    (@result int OUTPUT)
AS
    SELECT @result = COUNT(*)
    FROM dbo.TestData
    WHERE DATEDIFF(MINUTE, DateInserted, GETDATE()) < 120 --Number of minutes
      AND STATUS IN ('test1' )

    RETURN @result

非常感谢任何有关使用 Entity Framework Core 调用存储过程以返回单个值的帮助。

我也尝试查看此链接:

Entity Framework Core - Using Stored Procedure with output parameters

我没有看到任何内容:ExecuteSqlCommand。截图如下:

这些是我正在使用的框架:

我正在使用 .NET Core 控制台应用程序,这些是我的 .cs 文件中的 using 语句:

using System;
using System.Data;
using EVitalsStatusCheck.DAL.DB;
using Microsoft.EntityFrameworkCore;
using EVitalsStatusCheck.DAL;
using System.Data.SqlClient;

【问题讨论】:

  • 您不应该删除您的原始帖子,只是回复了编辑或评论
  • 您是否还在使用 Entity Framework 3?当前版本是 6.2
  • 相对于 IdentityPersonalData 实体,结果代表什么?它需要映射。如果您无法映射它,只需使用 Dapper 并通过在单个实体之外工作来省去您的麻烦。
  • 我尝试这样做,但仍然是说你的问题很接近,问一个新的
  • 我使用的是实体框架6.4.4

标签: c# entity-framework asp.net-core entity-framework-core


【解决方案1】:

像这样向你的 DbContext 添加一个方法:

    public int GetStatus()
    {
        var result = new SqlParameter("@result", SqlDbType.Int) { Direction = ParameterDirection.Output };
        
        this.Database.ExecuteSqlCommand("exec usp_GetIdentityProofStatus @result out", result);

        return (int)result.Value;
    }

并且存储过程不应该返回数据值。存储过程的返回值在成功时应为 0,否则应在失败时引发错误。

应该是这样的

ALTER PROCEDURE usp_GetStatus
    (@result int OUTPUT)
AS
BEGIN
    SELECT @result = COUNT(*)
    FROM dbo.TestData
    WHERE DATEDIFF(MINUTE, DateInserted, GETDATE()) < 120 --Number of minutes
      AND STATUS IN ('test1' )
END

【讨论】:

  • 谢谢。只需将 ExecuteSQLCommand 更改为 ExecuteSqlRaw 即可。
【解决方案2】:

来自doc

对于使用纯字符串执行 SQL 查询,请改用 ExecuteSqlRaw。对于使用插值字符串语法创建参数的 SQL 查询执行,请改用 ExecuteSqlInterpolated。

因为你的EFCore版本是5.0,所以ExecuteSqlCommand方法已经过时了,你可以用ExecuteSqlRaw ExecuteSqlInterpolated 来替换它。

【讨论】:

  • 我使用 ExecuteSqlRaw 而不是 ExecuteSQLCommand
猜你喜欢
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多