首页 > 解决方案 > ASP.NET Core Entity Framework 调用存储过程

问题描述

我正在使用 ASP.NET Core Entity Framework,我想调用一个简单的存储过程。

我在迁移中创建了存储过程,如下所示:

public partial class spGetAvailableCourses : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        var sp = @"CREATE PROCEDURE [dbo].[GetAvailableCourses]
            AS
            BEGIN
                SELECT COUNT(courses.Enrolled) FROM Courses WHERE Courses.Capacity > Courses.Enrolled;
            END";

        migrationBuilder.Sql(sp);
    }

我可以使用以下命令调用 SQL Server 中的存储过程。

EXEC dbo.GetAvailableCourses

但是当我尝试在 my 中调用存储过程时ICourseRepository,它不起作用,我得到了减去一个返回。

有人可以告诉我调用存储过程的正确性吗?谢谢

public class CourseRepository : ICourseRepository
{
    private readonly DataContext _context;

    public CourseRepository(DataContext context)
    {
        _context = context;
    }
   
    public Task<CoursesAvailableCount> CoursesAvailableCount()
    { 
        var ss = _context.Database.ExecuteSqlRaw("GetAvailableCourses");
        return null;
    }

我也试过

    public async Task<CoursesAvailableCount> CoursesAvailableCount()
    {
        var s = await _context.Database.ExecuteSqlCommandAsync("GetAvailableCourses");
    }

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

解决方案


除了 ExecuteSqlCommand 方法之外,DbContext.Database 属性还提供了一个 API,允许您直接执行 ADO.NET 操作。GetDbConnection 方法返回一个表示上下文底层连接的 DbConnection 对象。从那时起,您可以恢复到熟悉的 ADO.NET API:

using (var command = _context.Database.GetDbConnection ().CreateCommand ())
{
   command.CommandText = "SP_NAME";
   command.CommandType = CommandType.StoredProcedure;
   _context.Database.OpenConnection ();
   using (var result = command.ExecuteReader ())
   {
      if (result.HasRows)
      {
         result.Read ();
         var x = result.GetInt32 (0); // x = your sp count value
      }
   }
}

编辑(扩展示例):

public static class EfCoreExtensions
{
    public static int? Execute_SingleValue_SP_AsInt(this AppDbContext context,string SpName)
    {
        using (var command = context.Database.GetDbConnection().CreateCommand())
        {
            command.CommandText = SpName;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            context.Database.OpenConnection();
            using (var result = command.ExecuteReader())
            {
                if (result.HasRows)
                {
                    result.Read();
               var x = result.GetInt32(0); // x = your sp count value
                    return x;
                }
            return null;
            }
        
        }
    }
}

推荐阅读