调用在 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.EntityFrameworkCore
Nuget.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>>?