(nopCommerce 4.2)如何执行存储过程并获取返回模型.?

问题描述 投票:0回答:1

我正在使用nopCommerce 4.2,所有与表相关的CRUD操作都能正常工作,我就是找不到执行存储过程并获取产品列表模型的方法。我已经尝试使用下面的代码。

var pProductIds = _dataProvider.GetStringParameter("ProductIds", productIds);
var elasticIndexProducts =
_dbContext.QueryFromSql<ProductModel>("Exec SP_GetProductsForElastic @ProductIds", pProductIds).ToList();

但我得到一个错误信息说:"不能为'ProductModel'创建一个DbSet,因为这个类型不包括在上下文的模型中。"

这是我的模型

public class ProductModel
    {
        public DateTime IndexDate { get; set; }
        public string ProductId { get; set; }
        public string PartNumber { get; set; }
        public string Name { get; set; }
        public string MetaKeywords { get; set; }
        public string MetaDescription { get; set; }
        public string MetaTitle { get; set; }
        public int LimitedToStores { get; set; }
        public string ShortDescription { get; set; }
        public string FullDescription { get; set; }
        public string SeName { get; set; }
}

nopCommerce插件启动

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Nop.Core.Infrastructure;
using Nop.Web.Framework.Infrastructure.Extensions;


namespace JM.Plugin.Core
{
    /// <summary>
    /// Represents object for the configuring plugin DB context on application startup
    /// </summary>
    public class PluginDbStartup : INopStartup
    {
        /// <summary>
        /// Add and configure any of the middleware
        /// </summary>
        /// <param name="services">Collection of service descriptors</param>
        /// <param name="configuration">Configuration of the application</param>
        public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
        {
            //add object context
            services.AddDbContext<JM_Core_ObjectContext>(optionsBuilder =>
            {
                optionsBuilder.UseSqlServerWithLazyLoading(services);
            });
        }

        /// <summary>
        /// Configure the using of added middleware
        /// </summary>
        /// <param name="application">Builder for configuring an application's request pipeline</param>
        public void Configure(IApplicationBuilder application)
        {
        }

        /// <summary>
        /// Gets order of this startup configuration implementation
        /// </summary>
        public int Order => 11;
    }
}

这是我的插件对象上下文类

public class JM_Core_ObjectContext : DbContext, IDbContext
    {
        #region Ctor

        public JM_Core_ObjectContext(DbContextOptions<JM_Core_ObjectContext> options) : base(options)
        {
        }

        #endregion

        #region Utilities

        /// <summary>
        /// Further configuration the model
        /// </summary>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new JMStoreMap());
            modelBuilder.ApplyConfiguration(new JMPictureMap());
            modelBuilder.ApplyConfiguration(new JMTestimonialMap());
            modelBuilder.ApplyConfiguration(new JMBannerMap());

            modelBuilder.ApplyConfiguration(new QuoteMap());
            modelBuilder.ApplyConfiguration(new QuoteItemMap());
            modelBuilder.ApplyConfiguration(new QuoteCustomerMap());
            modelBuilder.ApplyConfiguration(new QuoteChangeLogMap());
            modelBuilder.ApplyConfiguration(new JMShoppingCartItemMap());
            modelBuilder.ApplyConfiguration(new ProductInquiryMap());
            modelBuilder.ApplyConfiguration(new SearchFilterMap());

            base.OnModelCreating(modelBuilder);
        }

        #endregion
}

QueryFromSql<>enter image description here

entity-framework-core nopcommerce
1个回答
0
投票

我只是找到了一种执行存储过程并检索产品列表模型的方法。我不知道这是不是标准的方法。但我解决了我的需求。

你需要为你的返回模型创建一个实体映射类,并在DB上下文模型构建器中注册。参考下面的例子。

返回模型类

    public partial class ElasticIndexGroupProductEntity
    {
        public int ProductId { get; set; }
        public string Name { get; set; }           
        public bool LimitedToStores { get; set; }           
        public string FullDescription { get; set; }
        public string SeName { get; set; }
        public string AssociatedProducts { get; set; }
        public bool StockAvailability { get; set; }
   }

创建实体映射类

    public partial class ElasticIndexGroupProductEntityMap :   NopQueryTypeConfiguration<ElasticIndexGroupProductEntity>
    {
       //no need to implement anything here
    }

在DB上下文中注册映射

       public class JM_Context : DbContext, IDbContext
       {
           public JM_Context(DbContextOptions<JM_Context> options): base(options)
           {

           }

           protected override void OnModelCreating(ModelBuilder modelBuilder)
           {
               modelBuilder.ApplyConfiguration(new ElasticIndexGroupProductEntityMap());
               base.OnModelCreating(modelBuilder);
           }
        }

存储过程示例。(async是可选的)

public async Task<IList<ElasticIndexGroupProduct>> GetElasticGroupProducts(int[] productIds)
{
    try
    {              
        var pProductIds = _dataProvider.GetStringParameter("ProductIds", string.Join(",", productIds));

        var groupProductsToIndex = await Task.WhenAll
        (
            _jmContext.QueryFromSql<ElasticIndexGroupProductEntity>("Exec SP_GetProductsForElastic", pProductIds).ToList()                   
        );               
        return groupProductsToIndex;
    }
    catch (Exception ex)
    {
        _loggerService.Error("[Elastic Search Indexing] Get Elastic Group Products Failed.", ex);
        return null;
    }           
}
© www.soinside.com 2019 - 2024. All rights reserved.