5

在我的 ViewModel 中,我有一些这样的代码:

public class OrderViewModel
{
    private UserOrder order;
    private DeliveryCentre deliveryCentre;

    // This is my EF Container
    private CatalogueContainer catalogue = new CatalogueContainer();

    // do some stuff...

    public void Save()
    {
        if (order == null)
        {
            order = catalogue.UserOrders.CreateObject();
        }
        // do some other stuff...

         if ((deliveryCentre == null)
            || (deliveryCentre.Id != deliveryCentreId))
        {
           deliveryCentre = catalogue.DeliveryCentres.First(centre => centre.Id == deliveryCentreId);

            //Causes a context error, not sure why...
            order.DeliveryCentre= deliveryCentre;
        }

        catalogue.SaveChanges();

    }

因此,当交付中心是新的并且订单是新的时,我遇到了旧的“无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象”错误,这对我来说似乎有点不公平 - 我只是无法弄清楚我需要做什么才能使它们更多地属于同一个对象上下文。我认为这是由于对实体框架行为的一些基本误解。

4

2 回答 2

3

你没有处理你的上下文。有可能其中一个实体orderdeliveryCentre附加到仍然持有对实体的引用的旧上下文。using您可以使用方法内部的语句创建和处置上下文,Save而不是将其用作成员变量:

public void Save()
{
    using (var catalogue = new CatalogueContainer())
    {
        // your code...
    }
}

并删除私人catalogue成员。

于 2012-04-25T17:13:38.723 回答
2

结果证明该解决方案仅与错误消息间接相关-@Slauma 询问了//do stuff...占位符,当我将这些注释掉时,错误消失了。

事实证明,那里还有另一种关系,我创建对象this.Item = new Item()而不是使用this.Item = catalogue.Items.CreateObject(),所以它是在上下文之外创建的,当它被添加到订单时,尽管订单本身是从本地上下文创建的,当项目被添加到其中,这以某种方式弄脏了上下文,但由于某种原因,这仅在我添加下一个相关对象时才出现问题。

于 2012-04-27T10:22:50.127 回答