我在使用 nopcommerce 1.9 时遇到问题,真的需要一些帮助。
我正在做的工作是将产品导入器添加到现有功能中。
在 iisreset 后首次运行时,导入程序运行良好。然而,之后的第二次和任何进一步的实例都会产生上述错误。这似乎在运行以下代码 IoC.Resolve().UpdateProduct(product) 时经常发生。此调用的代码如下:
/// <summary>
/// Updates the product
/// </summary>
/// <param name="product">Product</param>
public void UpdateProduct(Product product)
{
if (product == null)
throw new ArgumentNullException("product");
product.Name = CommonHelper.EnsureNotNull(product.Name);
product.Name = CommonHelper.EnsureMaximumLength(product.Name, 400);
product.ShortDescription = CommonHelper.EnsureNotNull(product.ShortDescription);
product.FullDescription = CommonHelper.EnsureNotNull(product.FullDescription);
product.AdminComment = CommonHelper.EnsureNotNull(product.AdminComment);
product.MetaKeywords = CommonHelper.EnsureNotNull(product.MetaKeywords);
product.MetaKeywords = CommonHelper.EnsureMaximumLength(product.MetaKeywords, 400);
product.MetaDescription = CommonHelper.EnsureNotNull(product.MetaDescription);
product.MetaDescription = CommonHelper.EnsureMaximumLength(product.MetaDescription, 4000);
product.MetaTitle = CommonHelper.EnsureNotNull(product.MetaTitle);
product.MetaTitle = CommonHelper.EnsureMaximumLength(product.MetaTitle, 400);
product.SEName = CommonHelper.EnsureNotNull(product.SEName);
product.SEName = CommonHelper.EnsureMaximumLength(product.SEName, 100);
if (!_context.IsAttached(product))
_context.Products.Attach(product);
_context.SaveChanges();
if (this.CacheEnabled)
{
_cacheManager.RemoveByPattern(PRODUCTS_PATTERN_KEY);
_cacheManager.RemoveByPattern(PRODUCTVARIANTS_PATTERN_KEY);
_cacheManager.RemoveByPattern(TIERPRICES_PATTERN_KEY);
_cacheManager.RemoveByPattern(CUSTOMERROLEPRICES_PATTERN_KEY);
}
//raise event
EventContext.Current.OnProductUpdated(null,
new ProductEventArgs() { Product = product });
}
我对这种类型的技术(ObjectContexts)没有太多经验,所以如果能提供一个完整的解决方案,那将非常感激。我在互联网上看到了很多这个错误的例子,但还没有找到一个对我有用/有意义的解决方案。根据我的阅读,显然正在发生的事情是该产品被附加到两个不同的 ObjectContexts。我认为这就是这里发生的事情,但我对技术的了解还不够,无法找出哪里/为什么。我尝试在 SaveChanges 之后分离,以便下次运行时不会重新附加同一个对象,但这并不是我预期的解决方案......
非常感谢,阿德里安。