3

В моей ViewModel У меня есть подобный код:Entity Framework - «Отношения между этими двумя объектами не может быть определена» ошибка, но я думаю, что я использую тот же контекст

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», что кажется мне пустяком несправедливо - я просто не могу понять что мне нужно сделать, чтобы сделать их более похожими на один и тот же контекст объекта. Я предполагаю, что это связано с некоторым фундаментальным непониманием поведения Entity Framework.

ответ

2

Решение оказалось косвенно связано с сообщением об ошибке - @Slauma спросила о заполнителях //do stuff..., и когда я прокомментировал это, ошибка исчезла.

Оказалось, что там было другое отношение, где я создавал объект как this.Item = new Item(), а не используя this.Item = catalogue.Items.CreateObject(), поэтому он создавался из контекста и когда он был добавлен в заказ, хотя сам заказ был создан из локальный контекст, когда элемент был добавлен к нему, это каким-то образом загрязняло контекст, но по какой-то причине это только показалось проблемой, когда я добавил следующий связанный объект.

3

Вы не располагаете своим контекстом. Возможно, что один из объектов order или deliveryCentre прикреплен к старому контексту, который все еще содержит ссылки на объекты. Вы можете создать и утилизовать свой контекст с using заявление внутри метода Save вместо того, чтобы использовать его в качестве переменной-члена:

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

И удалить частный catalogue элемент.

+0

Ну, порядок создается из контекста в начале метода, запрос доставки из него берется из нескольких строк позже. Правильно ли я понимаю, что контекст не является тем, что можно безопасно поддерживать на протяжении всего жизненного цикла объекта? Можете ли вы предложить какие-либо хорошие ресурсы о том, что скрытые характеристики, вызывающие эту проблему, и как безопасно использовать контекст? – glenatron

+0

@glenatron: 'ObjectContext' реализует' IDisposable', потому что есть неуправляемый ресурс (соединение Db), которое должно быть удалено. Если у вас есть объект, прикрепленный к двум различным контекстам, которые не расположены, вы получаете имеющуюся у вас ошибку. Я не вижу, что эта проблема может возникнуть в вашем коде, но есть «... do stuff ...» заполнители, и я не знаю весь контекст вашего кода. Вы проверяли мое предложение, если оно решает проблему? – Slauma

+0

«... do stuff ...» просто в основном проверяет и присваивает свойства заказа - я не мог видеть ничего особенного, но когда я прокомментирую это, ошибка прекращается, что заставляет меня задаться вопросом, есть ли у меня другое отношение, которое я назначаю, может использовать устаревший objectcontext для чего-то, и возникшее здесь сообщение просто немного вводит в заблуждение. – glenatron

 Смежные вопросы

  • Нет связанных вопросов^_^