我正在使用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
}
我只是找到了一种执行存储过程并检索产品列表模型的方法。我不知道这是不是标准的方法。但我解决了我的需求。
你需要为你的返回模型创建一个实体映射类,并在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;
}
}