2012-04-04 21 views
1

私のコードがクラッシュしていた理由を理解しようとするのに少し苦労しました。オブジェクトを再接続しようとすると、InvalidOperationExceptionが発生するのはなぜですか?

あなたは、元のメソッドと作業1の両方を見てみると、1つのラインの配置が異なっている

ctx.Inventories.Attach(this); 

元のメソッドが動作しないとき、私は困惑だが、もう一つはありません。 誰かが洞察力を提供することはできますか?

私は例外があります。

System.InvalidOperationException:同じキーを持つオブジェクトが既にObjectStateManagerに存在しています。 ObjectStateManagerは、同じキーを持つ複数のオブジェクトを追跡できません。

これは私の元のメソッドここで

public void RemoveDependency(int depId) 
    { 
     bool returnValue = false; 

     if (this.Id != 0 && depId > 0) 
     { 
      using (ApsEntities ctx = new ApsEntities()) 
      { 
       var query2 = from d in ctx.Dependencies 
          where d.Id == depId 
          select d; 

       Dependency found = query2.FirstOrDefault(); 

       if (found != null) 
       { 
       **ctx.Inventories.Attach(this);** 
        ctx.ObjectStateManager.ChangeObjectState(this, EntityState.Modified); 
        this.Dependencies.Remove(found); 

        ctx.SaveChanges(); 
       } 
      } 
     } 

     return returnValue; 
    } 

public void RemoveDependency(int depId) 
{ 
    bool returnValue = false; 

    if (this.Id != 0 && depId > 0) 
    { 
     using (ApsEntities ctx = new ApsEntities()) 
     { 
      **ctx.Inventories.Attach(this);** 

      var query2 = from d in ctx.Dependencies 
         where d.Id == depId 
         select d; 

      Dependency found = query2.FirstOrDefault(); 

      if (found != null) 
      { 
       ctx.ObjectStateManager.ChangeObjectState(this, EntityState.Modified); 
       this.Dependencies.Remove(found); 

       ctx.SaveChanges(); 
      } 
     } 
    } 

    return returnValue; 
} 
+0

一般的な控え:定義は「機能しません」。それが例外の場合は、例外を投稿してください。望ましくない動作である場合は、望ましい動作と実際の結果を投稿してください。 –

+0

申し訳ありません、クリス、私はそれを付けました。それは私の心を崩した。 – Lareau

答えて

3

行動はObjectStateManagerは関係の追跡に関係している私の加工方法です。

電流Inventoryアイテムが(最初の例のように)ObjectContextに知られていないときにInventoryDependency間の関係は、コンテキストによって認識されません。 InventoryObjectContextには不明であるため、にはそれがロードされ、そのアイテムはObjectContextに添付すると既に存在します。

第2の例では、まずInventoryを添付してからクエリを実行します。 ObjectContextは、DependencyオブジェクトをInventoryアイテムに明示的に添付します。

documentation状態:

ObjectStateManagerは、クエリ結果を追跡し、 複数重複クエリ結果をマージするためのロジックを提供します。また、ユーザーがオブジェクトを挿入、削除、または変更するときにインメモリの変更を が実行し、 が更新の変更セットを提供します。この変更セットは、変更プロセッサー によって変更を持続するために使用されます。

この現象は、関連するオブジェクトがObjectContextに知られていない場合には発生しません。

+0

素早くお返事ありがとうございます。私は、これが決して再び起こらないことを確かめるために、私の頭の後ろにこれを保持します。 – Lareau

関連する問題