c# - 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");
}
解决方案
除了 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;
}
}
}
}
推荐阅读
- r - R:单纯形错误:下标分配中不允许使用 NA
- javascript - 使用上下文菜单单击 DataTable 行
- apache-spark - Spark/Parquet 分区是否保持有序?
- java - 在 Eclipse IDE 中设置 Java Card 平台版本
- css - 实现助手文本语音气泡框箭头
- javascript - 使用方法将对象添加到数组
- caffe - 如何在 caffe 中实现 soft-argmax?
- python - 使用 setup.py 运行目前需要 pipenv 的测试
- sql - 如何连接来自两个单独的 SQL 查询输出的行
- sql - 这两个查询都应该给我相同的结果 - SQL