代码之家  ›  专栏  ›  技术社区  ›  AlleXyS

实体框架使用参数执行存储过程

  •  1
  • AlleXyS  · 技术社区  · 7 年前

    好吧,希望不要得到太多的旗子,但这很烦人。

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

    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:非静态字段、方法或属性“calculating.createrating(offerforcreate)”需要对象引用

    我看到的每个地方都必须指定实体,但是如果我的存储过程使用多个表,我可以指定哪个实体?

    ASP.NET核心Web API

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mohsin Mehmood    7 年前

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

     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

    应该使用依赖注入创建计算类的实例。以下是步骤:

    1. 创建接口计算

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

    2. 更新计算类以实现icalculaterating

    3. 在中注册dbcontext和icalculaterating映射 ConfigureServices startup.cs文件的方法如下:

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

      services.AddTransient<ICalculateRating, CalculateRating>();

    4. 在控制器构造函数中,输入icalculaterating类型的参数,该参数将在运行时由Microsoft依赖项注入框架注入:

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

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