【问题标题】:Call stored procedure that returns scalar value in Entity Framework Core [duplicate]调用在 Entity Framework Core 中返回标量值的存储过程 [重复]
【发布时间】:2021-11-08 00:30:38
【问题描述】:

使用 .Net Core 和 Entity Framework Core 5.0.7 我想调用一个返回标量值的存储过程。

据我所知,调用存储过程必须返回一个实体模型。

假设我在 SQL 中有一个产品表,存储过程返回一组产品,所以我们称之为

 var products = (await _dbContext.priducts.FromSqlRaw($"sp_GetProducts").ToListAsync())

但现在我遇到了另一种情况,它只返回一个标量值。我在 Stackoverflow 中阅读了很多文章和问题,所以我想出了一个我认为不好的可行解决方案。

我创建了一个名为ScalarBool的实体模型

public partial class ScalarBool
{
    public bool Value { get; set; }

    public override string ToString()
    {
        return Value.ToString();
    }
}

并将其添加到我的dbcontext

modelBuilder.Entity<ScalarBool>().HasNoKey();

我们正在使用数据库优先的方法。因此其他开发人员可能会强制执行 dbScaffold,并且该模型将消失,因为它实际上不是 SQL Server 中的表。

下面是我得到的其他不起作用的解决方案

        SqlParameter orderId = new SqlParameter("@orderid",orderId);
        SqlParameter customerid = new SqlParameter("@customerid", customerId);
        SqlParameter isDelivered = new SqlParameter
        {
            ParameterName = "@Value",
            SqlDbType = System.Data.SqlDbType.BigInt,
            Direction = System.Data.ParameterDirection.Output
        };

        await _dbContext.Database.ExecuteSqlCommandAsync("[dbo].[is_delivered] @orderid , @customerid, @Value", orderId , customerid, isDelivered);
        var isDelivered = Convert.ToInt64(isDelivered.Value);

但我得到了这个错误

“DatabaseFacade”不包含“ExecuteSqlCommandAsync”的定义,并且找不到接受“DatabaseFacade”类型的第一个参数的可访问扩展方法“ExecuteSqlCommandAsync”(您是否缺少 using 指令或程序集引用?)

那么这里最好的解决方案是什么?

【问题讨论】:

  • 添加 nuget 包 Microsoft.EntityFrameworkCore.Relational 并使用 Microsoft.EntityFrameworkCore 将其添加到您的类之上;
  • @viveknuna 我尝试安装包并添加 using 但仍然显示相同的错误
  • 重复项覆盖了第二次尝试(带有输出参数)。 ExecuteSqlCommand 在 EFC 1.x / 2.x 中,在 3.0 及更高版本中方法名称不同。传递SqlParameter 对象时,使用ExecuteSqlRaw

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


【解决方案1】:

安装:-

MicrosoftEntityFramworkCore.Tools

Microsoft.EntityFrameworkCore.SqlServer

如果不起作用,那么我建议您安装类似于您的 .net 核心版本的 NuGet 包。如果您的版本为 .net 核心 3.1,那么您的 NuGet 应该是 3.1/3.0/3.2,尤其是您的 Microsoft.EntityFrameworkCoreNuget.then安装Microsoft.EntityFrameworkCore.Relational

希望它能解决您的问题。

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    相关资源
    最近更新 更多