gpt4 book ai didi

c# - Nopcommerce 更新实体问题

转载 作者:太空狗 更新时间:2023-10-29 20:41:13 28 4
gpt4 key购买 nike

使用 NopCommerce 3.8,Visual Studio 2015 教授。

我创建了一个插件,负责对我的 Web API 进行静态调用,该 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);
.....

然后是绑定(bind)和更新的方法

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,它运行良好,直到调用更新为止。但我再次检查产品,发现管理部分没有任何变化。

plugin

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

更新:

在我的执行方法上为测试添加了以下内容。

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

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

最佳答案

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

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

更新:问题似乎源于异步调试不当。我试图遍历 await 调用的每个实例,简单地说我试图遍历技术上可能完成或可能尚未完成的集合。可能是由于调试不当,我没有意识到。

所以回答 await your collection 然后迭代。

关于c# - Nopcommerce 更新实体问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609158/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com