2011-09-16 2 views
0

nopcommerce 1.9에 문제가있어서 정말 도움이 필요합니다.IEntityChangeTracker의 여러 인스턴스에서 엔티티 개체를 참조 할 수 없습니다.

내가하고있는 작업은 기존 기능에 제품 가져 오기 도구를 추가하는 것입니다.

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) 이러한 유형의 매우 많은 경험을 가지고 있지 않기 때문에 완벽한 솔루션을 제공 할 수 있다면, 그것은 매우 감사하겠습니다 :이 호출하는 코드는 다음과 같습니다. 인터넷에서이 오류에 대한 예를 많이 보았지만 나에게 맞는 솔루션을 찾지 못했습니다. 필자가 읽은 바로는 분명히 제품이 두 개의 다른 ObjectContext에 연결된다는 것입니다. 나는 이것이 여기서 일어나는 일이라고 추측하지만, 어디서/왜 있는지를 알아내는 기술에 대해 충분히 알지 못합니다. SaveChanges 후에 분리하려고 했으므로 다음 번에 동일한 객체를 다시 연결하지 않았지만 예상대로 해결되지 않았습니다.

많은 감사, Adrian.

+0

디버깅 할 때 Attach (product) 문을 실행합니까? –

+0

그건 그게 오류 라인이야. – ajbrun

답변

1

제품이 포스트 백을 통해 캐시되고 있습니까? 일반적으로 객체가 정적 인 경우에 발생하지만 원래 페이지로드시 쿼리 된 다음 포스트 백에서 업데이트됩니다. 그 이유는 그것이 쿼리 된 객체 컨텍스트가 여기에있는 인스턴스와 다른 인스턴스이기 때문입니다.

먼저 Detach 메서드를 사용하여 엔티티를 분리하면이 작업을 수행 할 수 있습니다. 또는 다음에 대한 자세한 정보를 제공하십시오.

  • 정적으로 저장된 개체 컨텍스트가 있습니까?
  • 엔터티가 캐시되어 있습니까?
  • _context는 어디에 정의되었으며 컨텍스트를 어떻게 인스턴스화합니까?

HTH.

+0

안녕하세요 Brian, 개체가 정적으로 저장되지 않습니다. UpdateProduct (Product)와 동일한 파일에 정의되어 있습니다 private 읽기 전용 NopObjectContext _context; 업데이트 버튼의 기능은 현재 링크 버튼을 클릭 한 후 실행되지만 완료되면 Windows 서비스에서 호출 한 후에 실행됩니다. "제품"은 속도를 높이기 위해 캐시되며이 캐시는 다시 게시하는 동안 액세스합니다. 도움이되면 전체 ProductService.cs 파일을 찾을 수 있습니다. http://pastebin.com/yP0deSVB 도움이 될만한 정보가 있습니다. savechanges() 후에 컨텍스트 분리를 시도했지만 문제가 해결되지 않았습니다. – ajbrun

+0

죄송합니다 - ImportProduct 클래스의 모든 항목은 정적입니다. 허용되지 않습니까? 아니면이 문제를 해결할 수있는 방법이 있어야합니까? – ajbrun

+0

기본적으로 objectcontext가 웹 요청에 걸쳐 정적으로 저장되는 경우 이와 같은 문제가 발생합니다. 해결 방법은 Page.Items 컬렉션 또는 HttpContext.Current.Items 컬렉션과 같은 사전을 사용하여 현재 HTTP 요청에 대해서만 저장하는 것입니다. 현재 요청에 대해서만 활성화됩니다. –

관련 문제