调用在 Entity Framework Core 中返回标量值的存储过程 [重复]

Posted

技术标签:

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

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

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

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

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

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

我创建了一个名为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 【参考方案1】:

安装:-

MicrosoftEntityFramworkCore.Tools

Microsoft.EntityFrameworkCore.SqlServer

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

希望它能解决您的问题。

【讨论】:

以上是关于调用在 Entity Framework Core 中返回标量值的存储过程 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Entity Framework Core (2.1) 调用标量函数的最佳实践

以下方法或属性 [ Entity Framework Core ] [ OnModelCreating ] 之间的调用不明确

如何使用 Entity Framework Core 模拟异步存储库

Entity Framework Core 6.0 预览4 性能改进

EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?

如何在 Entity Framework Core 2.0 中从 DbDataReader 转换为 Task<IEnumerable<TEntity>>?