2013-03-18 21 views
5

Ich habe ohne Ergebnis dieses Programms wurde das Debuggen und leider kann ich nicht die Wurzel des Problems sehen. Ich bekomme diese Ausnahme: Die ObjectContext-Instanz wurde entfernt und kann nicht mehr für Operationen verwendet werden, die eine Verbindung erfordern.Entity Framework - Object angeordnet Ausnahme

Es gibt zwei Tabellen: - CustomerSet - OrderSet

Ein Feld mit dem Namen CUSTOMER_ID in der Orders-Tabelle, die die Beziehung zwischen den Tabellen gewährleistet, und es ist eine virtuelle Navigationseigenschaft Kunde in der Tabelle Bestellungen als auch genannt.

Das Szenario ist folgendes: ich ein Element in die Orders-Tabelle einfügen:

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

Im Insert-Methode gibt es DbContext in einer using-Anweisung, so dass es automatisch entsorgen, wenn nötig. Ich arbeite darin.

Danach muß I-Daten von dem zuvor eingefügten Elemente (zum Beispiel I eine Eigenschaft des Abnehmers Feldes benötigen). Und jetzt bin ich der Hoffnung, dass der Kunde Feldwert bekam:

Order o = GetOrder(order.order_id); 

Und ich habe dieses o mit einer Ausnahme im Feld Kunde: o.Customer eine Ausnahme vom Typ ‚System.ObjectDisposedException‘ warf

Ich spielte mit faulen Laden, Ein- oder Ausschalten, aber ich habe nicht trainiert. Die Situation ist die gleiche ...

Was mache ich ein Chaos mit? richtig

Was wirklich schön dabei ist, dass, wenn ich mit F11-Schritt-Schritt-go, es funktioniert oft!

Bitte helfen! Vielen Dank im Voraus.

+0

Sie benötigen einige weitere Details des Codes zu schreiben, ohne Wissen, wie und wenn du DbContext-Objekte bekommst, ist es unmöglich zu wissen, was vor sich geht. –

Antwort

4

Im Insert-Methode gibt es DbContext in einer using-Anweisung, so entsorgen automatisch, wenn

benötigt

Nicht gerade "bei Bedarf". Er fordert IDisposable.Dispose() auf dem Kontextobjekt, sobald sie außerhalb des Geltungsbereichs des using Block geht.

Danach, ich brauche Daten aus dem zuvor eingefügten Elemente

Ihr Kontext an dieser Stelle angeordnet ist. Wenn Ihre Aktion ein verzögertes Laden erfordert, schlägt das fehl, da der Kontext nicht verfügbar ist, um das verzögerte Laden durchzuführen.

Wenn Sie in der Regel Zugriff auf ein Objekt benötigen, das nicht geladen wurde, ist der effizienteste Ansatz wahrscheinlich, .Include zu verwenden, um es zu laden, wenn Sie den Rest Ihres Objektdiagramms abrufen. Das nennt man eifriges Laden.

Wenn Sie gelegentlich Zugriff auf ein Objekt benötigen, das nicht geladen wird, wenn Sie den Rest Ihres Objektgraphen laden, werden Sie einen neuen Kontext benötigen.

Für eine Diskussion Laden verwandte Objekte, schlage ich

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

+1

Nun, das .Include erfolgreich das Problem gelöst. Coole Funktion. Ich danke dir sehr! –

0

Wenn Sie eine using-Anweisung innerhalb Insert haben, dann wird der Kontext gegangen.

, die lange in Ordnung, wie Sie sicherstellen, dass die neue ID des Insert()order.order_id bekommt und dass GetOrder() Brände einen neuen Kontext als Teil