5

J'ai débogué ce programme sans aucun résultat, et malheureusement, je ne vois pas la racine du problème. Je reçois cette exception: l'instance ObjectContext a été supprimée et ne peut plus être utilisée pour les opérations nécessitant une connexion.Entity framework - exception objectcontext éliminée

Il y a 2 tables: - CustomerSet - OrderSet

Un champ nommé CUSTOMER_ID dans le tableau des commandes assure la relation entre les tables, et il y a une propriété de navigation virtuelle appelée client dans le tableau des commandes ainsi.

Le scénario est le suivant: insérer un élément dans la table Commandes:

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

Dans la méthode d'insertion, il est DBContext dans une déclaration à l'aide, il automatiquement disposer en cas de besoin. Je travaille à l'intérieur de cela. Après cela, j'ai besoin de données de l'élément précédemment inséré (par exemple, j'ai besoin de certaines propriétés du champ Client). Et maintenant, je suis en espérant que le champ de clientèle Valeur a:

Order o = GetOrder(order.order_id); 

et je me suis ce o une exception dans le domaine client: o.Customer a lancé une exception de type « System.ObjectDisposedException »

Je jouais avec un chargement paresseux, l'allumer ou l'éteindre, mais je n'ai pas travaillé. La situation est la même ...

Qu'est-ce que je fais avec?

Ce qui est vraiment bien dans tout ça, c'est que si je vais pas à pas avec F11, ça fonctionne souvent correctement!

Aidez s'il vous plaît! Merci d'avance.

+0

Vous devez poster quelques détails de votre code, sans connaissance de la façon dont et quand vous obtenez des objets DbContext, il est impossible de savoir ce qui se passe. –

Répondre

4

Dans la méthode d'insertion, il est DBContext dans une déclaration à l'aide, donc il disposer automatiquement si nécessaire

Pas exactement « au besoin ». Il appelle IDisposable.Dispose() sur l'objet de contexte dès qu'il est hors de portée du bloc using.

Après cela, je besoin de données de l'élément inséré précédemment

Votre contexte est disposé à ce stade. Si votre action nécessite un chargement différé, cela échouera car le contexte n'est pas disponible pour effectuer la charge paresseuse.

Si vous avez généralement besoin d'accéder à un objet qui n'a pas été chargé, l'approche la plus efficace consiste probablement à utiliser .Include pour le charger lorsque vous récupérez le reste de votre graphe d'objets. C'est ce qu'on appelle le chargement impatient.

Si vous avez parfois besoin d'accéder à un objet qui n'est pas chargé lorsque vous chargez le reste de votre graphe d'objet, vous aurez besoin d'un nouveau contexte.

Pour une discussion des objets liés au chargement, je suggère

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

+1

Eh bien, cela .Include résolu avec succès le problème. Fonction cool. Merci beaucoup! –

0

Si vous avez une déclaration à l'aide au sein Insert alors le contexte est parti.

C'est bien aussi longtemps que vous assurez-vous que dans le cadre du Insert()order.order_id obtient la nouvelle Id et que GetOrder() incendies un nouveau contexte

Questions connexes