Saya menggunakan ASP.NET Core Entity Framework dan saya ingin memanggil prosedur tersimpan sederhana.

Saya membuat prosedur tersimpan dalam migrasi saya seperti ini:

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);
    }

Saya dapat memanggil prosedur tersimpan di SQL Server dengan perintah berikut.

EXEC dbo.GetAvailableCourses

Tetapi ketika saya mencoba dan memanggil prosedur tersimpan di ICourseRepository saya, itu tidak berhasil, saya mendapatkan minus satu yang dikembalikan.

Dapatkah seseorang tolong beri tahu saya cara memanggil prosedur tersimpan yang benar? Terima kasih

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;
    }

Saya juga mencoba

    public async Task<CoursesAvailableCount> CoursesAvailableCount()
    {
        var s = await _context.Database.ExecuteSqlCommandAsync("GetAvailableCourses");
    }
1
Great Khan 2016 10 Juli 2020, 17:08

1 menjawab

Jawaban Terbaik

Selain metode ExecuteSqlCommand, properti DbContext.Database menyediakan API yang memungkinkan Anda untuk melakukan operasi ADO.NET secara langsung. Metode GetDbConnection mengembalikan objek DbConnection yang mewakili koneksi yang mendasari konteks. Sejak saat itu, Anda dapat kembali ke API ADO.NET yang sudah dikenal:

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 (contoh ekstensi):

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;
            }
        
        }
    }
}
1
Great Khan 2016 10 Juli 2020, 18:02