使用NopCommerce 3.8,Visual Studio 2015 proff。
我创建了一个插件,负责对我的Web API进行静态调用,将不同的数据库暴露给Nop。
这个过程是通过一个nop Task运行的,它成功地将数据拉回来,我可以按照我认为合适的方式进行操作,到目前为止没有任何问题。
当我尝试更新产品表上的记录时出现问题,我执行更新......但没有任何变化,没有变化,没有错误。
我认为这是由于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步,我认为它可能是因为1)上下文仍然不知道有问题的实体,或2)其不正确的调用。
摘要 更新未更新,可能是由于上下文不知道或我的方法错误。 (可能两者都有。)
更新
我在我的服务周围添加了一些logger.inertlog
,它运行良好,直到更新调用。但我再次检查产品,管理部分没有任何变化。
我提供了完整的源代码,因为我认为这可能与其余代码设置有关吗?
更新
在我的执行方法上为testin添加了以下内容。
var myprod = _productRepos.GetById(4852);
myprod.ShortDescription = "db test";
productRepos.Update(myprod);
这成功更新了产品说明。我将我的方法从我的服务转移到任务类但仍然没有运气。我看得越多,我就越想到我的异步就会以某种方式杀死数据库上下文。
答案 0 :(得分:0)
转为异步并将getbyid绑定到新产品,还删除了交换机的lambda并将其更改为foreach循环。似乎最终更新结果。
无法确认async是否是罪魁祸首,目前web api似乎返回了相同的结果,即使数据发生了变化(在.net核心中由于deafult的一些奇怪的缓存?)所以我为此创建了一个新的问题。 / p>
更新:问题似乎源于异步调试不佳。我试图迭代await调用的每个实例,只是让我试图迭代一个技术上可能已经完成或者可能尚未完成的集合。可能由于调试不佳,我不知道。
所以回答等待你的收集然后迭代。