0

以前にこの質問を投稿しましたが、私が何をしているのかをかなり徹底的に説明しています: ASP.NET MVC3 and Entity Framework v4.1 with error An entity object cannot be reference by multiple instances of IEntityChangeTracker

問題は、上記の質問でこの特定の問題を修正した後、ミニカート、カートの紛失、チェックアウトページなどでこの問題が数回再浮上したことです. さらなる問題はこれに関連していますが、特定するのは必ずしも容易ではなく、トラブルシューティング、発見、および修正にかなりの時間を要しました。最新の特定の問題を投稿するのではなく、一般的に何か間違っているかどうかを調べたいと思います。エンティティであるカートをセッションに保存するか、それを切り離すより良い方法 (以下に示す切り離し方法) のいずれか、またはこれらのタイプの問題をデバッグする簡単な方法はありますか? これが私の detach メソッドの更新です。

    public void DetachCart(Cart cart)
    {
        var objectContext = ((IObjectContextAdapter)context).ObjectContext;
        if (cart.Customer != null)
        { objectContext.Detach(cart.Customer); }
        if (cart.ShipFromAddress != null)
        {
            var shipFromAddress = cart.ShipFromAddress;
            objectContext.Detach(cart.ShipFromAddress);
            cart.ShipFromAddress = shipFromAddress;
        }
        if (cart.ShipToAddress != null)
        {
            var shipToAddress = cart.ShipToAddress;
            objectContext.Detach(cart.ShipToAddress);
            cart.ShipToAddress = shipToAddress;
        }
        if (cart.Lines != null && cart.Lines.Count > 0)
        {
            List<CartLine> lines = new List<CartLine>();
            foreach (var item in cart.Lines.ToList())
            { 
                objectContext.Detach(item);
                lines.Add(item);
            }
            cart.Lines = lines;
        }
        objectContext.Detach(cart);
    }

この問題について私に提供できる洞察をありがとう。これは長く苦しい道のりでした。

更新 私のトラブルの多くはCartModelBinder、カートを取り外した状態ではなく、取り付けた状態のままにしておくことが原因のようです。それを変更することで、現在の問題が解消され、この問題を回避するために切り離さなければならなかったいくつかの場所が削除されました。ただし、「すべてを切り離す簡単な方法、またはこれらの問題をデバッグ/追跡する方法はありますか」という私の質問はまだ残っています。

4

1 に答える 1

1

解決策は 1 つあります。ビューまたはモデル バインダーでエンティティを使用しないでください。データをデータベースに保存する場合にのみ、ビュー モデルを使用してエンティティに変換します。アプリケーションがより複雑になる可能性がありますが、リークされたコンテキスト、アタッチおよびデタッチに関する問題のトラブルシューティングにかかる​​時間を大幅に節約できます。

于 2013-01-02T23:14:07.657 に答える