首页 > 解决方案 > 实体框架使用参数执行存储过程

问题描述

好的,希望不要得到太多的标志,但这很烦人。

我的控制器中有一个方法,它调用另一个类的方法:

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

标签: entity-frameworkasp.net-coreprocedure

解决方案


您可以像这样执行存储过程:

 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 类的实例。以下是步骤:

  1. 创建接口 ICalculateRating

    public interface ICalculateRating { decimal CreateRating(OfferForCreate offer); }

  2. 更新 CalculateRating 类以实现 ICalculateRating

  3. ConfigureServices在Startup.cs 文件的方法中注册 DBContext 和 ICalculateRating 映射,如下所示:

    services.AddDbContext<DbContext>(opts=> { opts.UseSqlServer("sqlserver conntection string") }, ServiceLifetime.Scoped);

    services.AddTransient<ICalculateRating, CalculateRating>();

  4. 在您的控制器构造函数中,输入 ICalculateRating 类型的参数,该参数将由 Microsoft Dependency Injection 框架在运行时注入:

    private readonly ICalculateRating _calculateRating; public MyController(ICalculateRating calculateRating) { _calculateRating = calculateRating; }

然后,您可以像这样调用该方法: offerForCreate.Rating = _calculateRating.CreateRating(addOffer);


推荐阅读