您可以这样执行存储过程:
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
。
应该使用依赖注入创建计算类的实例。以下是步骤:
-
创建接口计算
public interface ICalculateRating {
decimal CreateRating(OfferForCreate offer);
}
-
更新计算类以实现icalculaterating
-
在中注册dbcontext和icalculaterating映射
ConfigureServices
startup.cs文件的方法如下:
services.AddDbContext<DbContext>(opts=> { opts.UseSqlServer("sqlserver conntection string") }, ServiceLifetime.Scoped);
services.AddTransient<ICalculateRating, CalculateRating>();
-
在控制器构造函数中,输入icalculaterating类型的参数,该参数将在运行时由Microsoft依赖项注入框架注入:
private readonly ICalculateRating _calculateRating;
public MyController(ICalculateRating calculateRating) {
_calculateRating = calculateRating;
}
然后您可以这样调用方法:
offerForCreate.Rating = _calculateRating.CreateRating(addOffer);