【发布时间】: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