实体框架 - “两个对象之间的关系无法定义”错误,但我认为我使用的是相同的上下文

时间:2012-04-25 16:22:53

标签: c# entity-framework-4 ado.net ado.net-entity-data-model

在我的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对象”错误,这对我来说似乎有点不公平 - 我只是无法弄清楚我需要做些什么来使它们更属于同一个对象上下文。我认为这是由于对实体框架行为的一些基本误解。

2 个答案:

答案 0 :(得分:3)

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

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

删除隐私catalogue成员。

答案 1 :(得分:2)

解决方案结果只是与错误信息间接相关 - @Slauma询问了//do stuff...占位符,当我评论错误时,错误消失了。

原来,那里有另一种关系,我在那里创建对象this.Item = new Item()而不是this.Item = catalogue.Items.CreateObject(),所以它是在上下文中创建的,当它被添加到订单中时,虽然订单本身是从本地上下文创建的,但是当项目被添加到它时,这在某种程度上弄脏了上下文,但由于某种原因,当我添加下一个相关对象时,这只会出现问题。