entity-framework - 实体框架使用参数执行存储过程
问题描述
好的,希望不要得到太多的标志,但这很烦人。
我的控制器中有一个方法,它调用另一个类的方法:
offerForCreate.Rating = CalculateRating.CreateRating(addOffer);
和整个被调用的类:
public class CalculateRating
{
private readonly DataContext mainContext;
public CalculateRating(DataContext mainContext)
{
this.mainContext = mainContext;
}
// calcul rating oferte noi
public decimal CreateRating(OfferForCreate offer)
{
decimal rating = mainContext.Database.FromSql<decimal>("RatingCalculator", offer.locationId, offer.typeId);
return rating;
}
}
尝试执行此过程时出现错误:
错误 CS1061:“DatabaseFacade”不包含“FromSql”的定义,并且找不到接受“DatabaseFacade”类型的第一个参数的扩展方法“FromSql”
如果我不在CalculateRating
我的控制器中创建类的实例,另一个:
Controllers\AnnouncesController.cs(127,37):错误 CS0120:非静态字段、方法或属性 'CalculateRating.CreateRating(OfferForCreate) 需要对象引用
我看到的任何地方都必须指定实体,但是如果我的存储过程使用多个表,我可以指定什么实体?
Asp.Net Core Web API
解决方案
您可以像这样执行存储过程:
using (var command = mainContext.Database.GetDbConnection().CreateCommand())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "dbo.RatingCalculator";
var locationIdParam = new System.Data.SqlClient.SqlParameter("@locationId", System.Data.SqlDbType.Int);
locationIdParam .Value = offer.locationId;
//DO same for typeId parameter
//Params to Parameters collection
command.Parameters.Add(locationIdParam);
command.Connection.Open();
return (double)command.ExecuteScalar();
}
Controllers\AnnouncesController.cs(127,37): error CS0120: An object reference is required for the non-static field, method, or property 'CalculateRating.CreateRating(OfferForCreate)
发生此错误是因为如果您声明CalculateRating
为静态,则无法在非静态字段中引用mainContext
。
您应该使用依赖注入创建 CalculateRating 类的实例。以下是步骤:
创建接口 ICalculateRating
public interface ICalculateRating { decimal CreateRating(OfferForCreate offer); }
更新 CalculateRating 类以实现 ICalculateRating
ConfigureServices
在Startup.cs 文件的方法中注册 DBContext 和 ICalculateRating 映射,如下所示:services.AddDbContext<DbContext>(opts=> { opts.UseSqlServer("sqlserver conntection string") }, ServiceLifetime.Scoped);
services.AddTransient<ICalculateRating, CalculateRating>();
在您的控制器构造函数中,输入 ICalculateRating 类型的参数,该参数将由 Microsoft Dependency Injection 框架在运行时注入:
private readonly ICalculateRating _calculateRating; public MyController(ICalculateRating calculateRating) { _calculateRating = calculateRating; }
然后,您可以像这样调用该方法:
offerForCreate.Rating = _calculateRating.CreateRating(addOffer);
推荐阅读
- python - Tkinter pages updated from separate files
- kotlin - @DSLMarker not limiting the scope of DSL
- multithreading - 在线程内部时括号不释放资源
- sql-server - SQL Server parallel execution
- python - 附加到嵌套的 NumPy 数组
- tableau-api - 如何将前导空格添加到 Tableau 整数
- xcode - Swift 5.0 为存储在 EnvironmentObject 中的数组对象赋值的最佳方法
- css - 100vh以下的html空白覆盖背景图像,导致滚动条
- r - 连续计算天数,但在同一天保持计数
- javascript - 无法弄清楚为什么我的 ROT13 转换器适用于小写,但不适用于大写