0

我之前发布了这个问题,它非常彻底地解释了我正在做的事情: ASP.NET MVC3 and Entity Framework v4.1 with error An entity object cannot be referenced by multiple instances of IEntityChangeTracker

问题是,在我解决了上述问题中的这个特定问题后,这个问题已经多次出现在迷你购物车、丢失的购物车、结帐页面等。其他问题与此相关,但不一定容易识别,并且需要花费大量时间进行故障排除、查找和修复。与其发布我最新的具体问题,不如找出我是否做错了什么。通过将作为实体的购物车存储在 Session 中,或者通过更好的方式将其分离(如下所示的分离方法),或者是否有更简单的方法来调试这些类型的问题?这是我的分离方法的更新:

    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

有一种解决方案 - 不要在视图或模型绑定器中使用实体。仅当您将数据保存到数据库时才使用视图模型并将它们转换为实体。它可以使您的应用程序更加复杂,但在解决泄漏上下文、附加和分离问题时,它将为您节省大量时间。

于 2013-01-02T23:14:07.657 回答