ASP. NET Core Entity Framework вызывает хранимую процедуру - PullRequest
1 голос
/ 10 июля 2020

Я использую 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 сервере с помощью следующей команды.

EXEC dbo.GetAvailableCourses

Но когда я пытаюсь вызвать процедуру хранения в моем 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");
    }

1 Ответ

1 голос
/ 10 июля 2020

В дополнение к методу 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
      }
   }
}

EDIT (пример расширения):

public static class EfCoreExtentions
{
    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;
            }
        
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...