Nopcommerce 更新实体问题

Posted

技术标签:

【中文标题】Nopcommerce 更新实体问题【英文标题】:Nopcommerce Update entity issue 【发布时间】:2017-05-27 07:45:14 【问题描述】:

使用 NopCommerce 3.8、Visual Studio 2015 专业版。

我创建了一个插件,负责对我的 Web API 进行安静的调用,将不同的数据库暴露给 Nop。

这个过程是通过一个 nop 任务运行的,它成功地把数据拉回来,我可以逐步完成并按照我认为合适的方式进行操作,到目前为止没有问题。

当我尝试更新产品表上的记录时出现问题,我执行更新...但没有任何反应,没有变化,没有错误。

我相信这是因为 Context 不知道我新实例化的产品对象,但是我对与我的特定示例相关的我需要做的事情一无所知。

类似问题通常引用作为方法调用参数一部分的“模型”对象,“模型”具有方法ToEntity,这似乎是堆栈中类似问题的答案。

但是我的示例没有ToEntity 类/方法可能是因为我的参数实际上是一个产品列表。在这里澄清我的代码。

RestClient.cs 中的方法

public async Task<List<T>> GetAsync()
    
        try
        
            var httpClient = new HttpClient();

            var json = await httpClient.GetStringAsync(ApiControllerURL);

            var taskModels = JsonConvert.DeserializeObject<List<T>>(json);

            return taskModels;
        
        catch (Exception e)
        
            return null;
        
    

我的服务类中的方法

public async Task<List<MWProduct>> GetProductsAsync()
    
        RestClient<MWProduct> restClient = new RestClient<MWProduct>(ApiConst.Products);
        var productsList = await restClient.GetAsync();

        InsertSyncProd(productsList.Select(x => x).ToList());
        return productsList;
    
 private void InsertSyncProd(List<MWProduct> inserted)
    
        var model = inserted.Select(x =>
        
            switch (x.AD_Action)
            
                case "I":
                    //_productService.InsertProduct(row);
                    break;
                case "U":
                    UpdateSyncProd(inserted);
                  .....

然后是绑定更新的方法

private void UpdateSyncProd(List<MWProduct> inserted)
    
        var me = inserted.Select(x =>
        
            var productEnt = _productRepos.Table.FirstOrDefault(ent => ent.Sku == x.Sku.ToString());
            if(productEnt != null)
            
                productEnt.Sku = x.Sku.ToString();
                productEnt.ShortDescription = x.ShortDescription;
                productEnt.FullDescription = x.FullDescription;
                productEnt.Name = x.Name;
                productEnt.Height = x.Pd_height != null ? Convert.ToDecimal(x.Pd_height) : 0;
                productEnt.Width = x.Pd_width != null ? Convert.ToDecimal(x.Pd_width) : 0;
                productEnt.Length = x.Pd_depth != null ? Convert.ToDecimal(x.Pd_depth) : 0;
                productEnt.UpdatedOnUtc = DateTime.UtcNow;
            
            //TODO: set to entity so context nows and can update
            _productService.UpdateProduct(productEnt);

            return productEnt;
        );

    

如您所见,我获取数据并根据结果将数据传递给特定方法。从我迭代的方法中的该列表中,并从表中提取实体,然后使用该操纵实体通过产品服务进行更新。

所以我在这里遗漏了什么,我确定它的第一步,我认为这可能是因为 1)上下文仍然不知道有问题的实体,或者 2)它的错误调用。

总结 更新没有更新,可能是因为上下文不知道或者我的方法是错误的。 (可能两者都有)。

更新:

我在我的服务周围添加了一些logger.inertlog,它运行良好,完全可以调用更新。但是我再次检查了产品,管理部分没有任何变化。

plugin

我提供了完整的源代码,因为我认为这可能与其余代码设置有关?

更新:

在我的执行方法中添加了以下测试。

var myprod = _productRepos.GetById(4852);
myprod.ShortDescription = "db test";
productRepos.Update(myprod);

这成功更新了产品描述。我将我的方法从我的服务移到了任务类中,但仍然没有运气。我越看越觉得我的异步正在以某种方式杀死数据库上下文。

【问题讨论】:

您好,您是直接签入数据库吗?那里显示的变化? 是的,nio 在更新的地方发生了变化,所以我不认为这是缓存问题,尽管谁知道 好的,代码看起来不错,需要进一步调查。 我在我的问题中提供了源代码 还是什么都没有,为调查这个 Div 干杯 【参考方案1】:

关闭异步并将 getbyid 绑定到新产品,还删除了开关的 lambda 并将其更改为 foreach 循环。好像终于更新结果了。

无法确认异步是否是罪魁祸首,目前 web api 似乎正在返回相同的结果,即使数据已更改(.net 核心中的一些奇怪的缓存由 deafult 引起?)所以我为此创建了一个新问题。

更新:问题似乎源于异步调试不佳。我试图迭代一个等待调用的每个实例,只是让我试图迭代一个在技术上可能完成或可能尚未完成的集合。可能是由于调试不佳,我不知道。

所以回答等待你的收藏然后迭代。

【讨论】:

以上是关于Nopcommerce 更新实体问题的主要内容,如果未能解决你的问题,请参考以下文章

Nopcommerce 之事件机制

在快速自定义的NopCommerce中使用实体框架(EF)代码优先迁移

NopCommerce添加事务机制

我的NopCommerce之旅: 系统综述

如何向 NOPCommerce v2.4 添加新表

我的NopCommerce之旅: 系统代码结构分析