2013-03-18 15 views
5

Ho eseguito il debug di questo programma senza alcun risultato e purtroppo non riesco a vedere la radice del problema. Ottengo questa eccezione: l'istanza ObjectContext è stata eliminata e non può più essere utilizzata per operazioni che richiedono una connessione.Entity framework - objectcontext disposed exception

ci sono 2 tavoli: - CustomerSet - OrderSet

un campo denominato CUSTOMER_ID nella tabella Ordini assicura la relazione tra le tabelle, e non v'è una struttura di navigazione virtuale chiamato cliente nella tabella Ordini pure.

Lo scenario è il seguente: inserisco un elemento nella tabella Ordini:

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

All'interno del metodo di inserimento c'è DbContext in un'istruzione using, in modo da smaltire automaticamente quando necessario. Lavoro dentro questo.

Successivamente, ho bisogno di dati dall'elemento precedentemente inserito (ad esempio, ho bisogno di alcune proprietà del campo Cliente). E ora sto sperando che il campo Cliente ha valore:

Order o = GetOrder(order.order_id); 

E ho ottenuto questo o con un'eccezione nel campo Cliente: o.Customer ha generato un'eccezione di tipo 'System.ObjectDisposedException'

Stavo giocando con il caricamento pigro, accendendolo o spegnendolo, ma non ho funzionato. La situazione è la stessa ...

Con cosa faccio casino?

Ciò che è veramente bello in questo, che se passo passo dopo passo con F11, spesso funziona correttamente!

Si prega di aiuto! Grazie in anticipo.

+0

È necessario inserire alcuni dettagli del codice, senza la conoscenza di come e quando ricevi gli oggetti DbContext è impossibile sapere cosa sta succedendo. –

risposta

4

All'interno del metodo di inserimento c'è DbContext in un'istruzione using, in modo da disporre automaticamente quando necessario

Non esattamente "quando necessario". Chiama IDisposable.Dispose() sull'oggetto di contesto non appena esce dal campo di applicazione del blocco using.

Dopo di che, ho bisogno di dati dall'elemento precedentemente inserito

vostro contesto è disposta in questo punto. Se l'azione richiede un caricamento lento, ciò non riuscirà perché il contesto non è disponibile per eseguire il carico lento.

Se generalmente è necessario accedere a un oggetto che non è stato caricato, l'approccio più efficiente è probabilmente quello di utilizzare .Include per caricarlo quando si recupera il resto del grafico dell'oggetto. Questo si chiama caricamento avido.

Se occasionalmente è necessario accedere a un oggetto che non è caricato quando si carica il resto del grafico dell'oggetto, sarà necessario un nuovo contesto.

Per una discussione di oggetti correlati di carico, mi permetto di suggerire

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

+1

Bene, questo .Include risolto il problema con successo. Funzione di raffreddamento Grazie mille! –

0

Se si dispone di un'istruzione using all'interno Insert poi il contesto è andato.

Questo è bene finché si assicura che, nell'ambito del Insert()order.order_id ottiene il nuovo ID e che GetOrder() fuochi di un nuovo contesto

Problemi correlati