2013-03-18 23 views
5

Debugowałem ten program bez żadnego wyniku i niestety nie widzę źródła problemu. Otrzymuję ten wyjątek: Instancja ObjectContext została usunięta i nie można jej już używać do operacji wymagających połączenia.Framework Entity - obiektcontext dispposed wyjątek

Istnieją 2 tabele: - CustomerSet - OrderSet

Pole o nazwie customer_id w tabeli Orders gwarantuje relacji między tabelami, a tam jest wirtualną własność nawigacji o nazwie klienta w tabeli Zamówienia, jak również.

Scenariusz jest następujący: wstawić element do tabeli Zamówienia:

Order order = new Order(); 
Order.order_id = GenerateId(IdType.Order); 
Order.date = DateTime.Now; 
Order.Customer_id = GetCustomerId(tbCustomerName.Text); 
Insert(order); 

W metodzie Insert jest DBContext w użyciu instrukcji, więc automatycznie wyrzucać gdy są potrzebne. Pracuję w tym.

Po tym czasie potrzebuję danych z wcześniej wstawionego elementu (na przykład potrzebuję jakiejś właściwości pola Klient). A teraz mam nadzieję, że pole Klient dostaje wartość:

Order o = GetOrder(order.order_id); 

I mam tę O z wyjątkiem w dziedzinie gości: o.Customer zwrócił wyjątek typu „System.ObjectDisposedException”

Grałem z leniwym ładowaniem, włączałem lub wyłączałem, ale nie wyszło. Sytuacja jest taka sama ...

Co powoduje bałagan?

Co jest w tym naprawdę miłe, że jeśli pójdę krok po kroku z F11, często działa poprawnie!

Proszę pomóc! Z góry dziękuję.

+0

musisz odpowiedzieć trochę więcej szczegółów o kodzie, bez wiedzy o tym, jak a kiedy dostajesz obiekty DbContext, nie możesz wiedzieć, co się dzieje. –

Odpowiedz

4

W metodzie Insert jest DBContext w użyciu instrukcji, więc w razie potrzeby automatycznie wyrzucać

Niezupełnie „w razie potrzeby”. Wywołuje IDisposable.Dispose() na obiekcie kontekstu, gdy tylko wykracza poza zakres bloku using.

Potem potrzebne dane z uprzednio zamontowanym elementem

kontekstu jest umieszczona w tym punkcie. Jeśli twoja akcja wymaga leniwego ładowania, to się nie powiedzie, ponieważ kontekst nie jest dostępny do wykonania leniwego obciążenia.

Jeśli zazwyczaj potrzebujesz dostępu do obiektu, który nie został załadowany, najskuteczniejszym rozwiązaniem będzie prawdopodobnie użycie .Include w celu załadowania go, gdy pobierzesz resztę wykresu obiektu. Nazywa się to żarliwym ładowaniem.

Jeśli okazjonalnie potrzebujesz dostępu do obiektu, który nie został załadowany po załadowaniu reszty wykresu obiektów, będziesz potrzebować nowego kontekstu.

Omówienie związane załadunku przedmiotów, proponuję

http://msdn.microsoft.com/en-us/data/jj574232.aspx

+1

Cóż, to. Włącznie udało się rozwiązać problem. Funkcja chłodzenia. Dziękuję bardzo! –

0

Jeśli masz using w Insert następnie kontekst nie ma.

To jest w porządku tak długo, jak upewnić się, że jako część Insert()order.order_id dostaje nowy identyfikator i że GetOrder() pożary nowy kontekst