2011-09-16 12 views
0

nopcommerce 1.9に問題があり、本当に助けてください。IEntityChangeTrackerの複数のインスタンスでエンティティオブジェクトを参照できません

私がやっている仕事は、既存の機能に製品インポータを追加することです。

iisresetの後で初めて実行すると、インポータは正常に動作します。しかし、その後の2回目以降には上記のエラーが発生します。これは、次のコード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)のこのタイプの非常に多くの経験を持っていないので、完全なソリューションを提供することができれば、それは非常に高く評価されるだろう。これが呼び出すコードは以下の通りです。私はインターネット上でこのエラーの例をたくさん見てきましたが、うまく動作する解決策を見つけられませんでした。私が読んだところで、明らかに起こっていることは、製品が2つの異なるObjectContextにアタッチされていることです。私はこれがここで起こっていると仮定していますが、どこ/なぜを見つける技術については十分に分かりません。私はSaveChangesの後に切り離してみました。次回は同じオブジェクトを再接続しないようにしましたが、それは解決策ではありませんでした。...

多くのありがとう、アドリアン。

+0

デバッグ時に、Attach(product)文が実行されますか? –

+0

それはそれが誤りである行です。 – ajbrun

答えて

1

商品はポストバックでキャッシュされていますか?通常は、オブジェクトが静的である場合に発生しますが、もともと最初のページの読み込み時に照会され、ポストバックなどで更新されました。その理由は、照会されたオブジェクト・コンテキストが、ここにあるものとは異なるインスタンスであったためです。

最初にDetachメソッドを使用してエンティティを切り離すと、これを実行できます。それ以外の場合は、詳細情報をご記入ください:

  • オブジェクトコンテキストは静的に格納されていますか?
  • エンティティはキャッシュされていますか?
  • _contextはどこで定義されていますか、どのようにコンテキストをインスタンス化していますか?

HTH。

+0

こんにちはBrian、 オブジェクトは静的に格納されていません。これは、UpdateProduct(Product)と同じファイルで定義されています private readonly NopObjectContext _context; 現在、アップデータの機能はリンクボタンをクリックした後に起動しますが、完了するとWindowsサービスが呼び出した後に起動します。 「製品」は速度のためにキャッシュされ、このキャッシュはポストバック中にアクセスされます。 ProductService.csファイル全体が役に立ちます。 http://pastebin.com/yP0deSVB 助けてください。私はsavechanges()の後でコンテキストを切り離そうとしましたが、それは問題を解決していません。 – ajbrun

+0

申し訳ありません - ImportProductクラスのすべてが静的です。これは許可されていないのですか? – ajbrun

+0

本質的に、objectcontextがWebリクエストを介して静的に格納されると、このような問題が発生します。この問題を回避するには、Page.ItemsコレクションやHttpContext.Current.Itemsコレクションのような辞書を使用して、現在のHTTP要求に対してのみ格納します。これらは現在の要求に対してのみ有効です。 –

関連する問題