1

コードがクラッシュした理由を理解しようとすると、少し苦労しました(これが機能するようになりました)。

元の方法と実際の方法の両方を見ると、1つの線の配置が異なります

ctx.Inventories.Attach(this);

元の方法が機能しないのに、2番目の方法は機能するので困惑します。誰かがいくつかの洞察を提供できますか?

これが私が得る例外です。

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;
}
4

1 に答える 1

3

この動作は、関係のObjectStateManager追跡に関係しています。

現在のInventoryアイテムがObjectContext(最初の例のように) に認識されていない場合、 と の間の関係InventoryDependencyコンテキストによって認識されません。のクエリでInventoryは が不明であるため、 はそれをロードし、 にアタッチするとアイテムはすでに存在します。ObjectContextInventoryObjectContext

2 番目の例では、最初にクエリをアタッチInventoryしてから実行します。は、オブジェクトをアイテムObjectContextに明示的にアタッチします。DependencyInventory

ドキュメントには次のように記載されています。

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

関連するオブジェクトが に認識されていない場合、この動作は発生しませんObjectContext

于 2012-04-04T17:54:11.780 に答える