Je recherche un moyen d'annuler les modifications d'entité. Je suis tombé sur cette réponse qui montre comment définir l'état de l'entité, mais je me demande ce qui se passe si je me débarrasse simplement de mon { {X0}} sans appeler dbContext.SaveChanges() ni manipuler les états d'entité.

Le code que j'ai écrit pour cela fonctionne définitivement, mais est-ce que je laisse quelque chose dans un état instable en rejetant les modifications de cette manière?

3
oscilatingcretin 20 avril 2017 à 16:55

3 réponses

Meilleure réponse

que se passe-t-il si je dispose simplement de mon instance dbContext sans appeler dbContext.SaveChanges () ou manipuler les états d'entité

Rien. Les instances qui étaient précédemment attachées à l'instance DbContext désormais supprimée continuent d'exister comme n'importe quelle instance normale en supposant qu'il y a un handle sur ces instances quelque part par quelque chose. S'il n'y en a pas, la mémoire sera libérée et finalement récupérée comme n'importe quelle autre instance normale de quelque chose s'il n'y a pas de handle. L'état des entités en mémoire reste tel quel, rien en mémoire n'est automatiquement rétabli. Le magasin de base de données reste également "tel quel", ce qui signifie qu'il n'y a aucun appel du DbContext vers le magasin de données.

est-ce que je laisse quelque chose dans un état instable en rejetant les changements de cette manière

Non, du moins pas dans le magasin de données. En mémoire, c'est difficile à dire, cela dépend de l'endroit où le code s'est arrêté et des dépendances sur les modifications jusqu'à ce point. Supposons que c'est une application asp.net sans état, peut-être que la demande se termine simplement et dans ce cas, rien d'instable ne devrait se produire avec l'une des demandes suivantes, car elles devraient récupérer tout ce qui est nécessaire dans le magasin de données.

Si c'est quelque chose de plus durable comme une application Windows, vous devrez peut-être vous assurer manuellement que tous les pointeurs / poignées vers les instances qui étaient précédemment suivies sont mis à jour avec l'état en mémoire maintenant rétabli ou libérer ces pointeurs.

En ce qui concerne les nouvelles instances de DbContext, elles fonctionnent toutes indépendamment les unes des autres, il n'y a donc pas de continuation entre elles. Le nouveau DbContext ne connaît pas l'état en cours de suivi ou l'état qui a été suivi par toute autre instance de DbContext.

3
Igor 20 avril 2017 à 18:21

L'appel de la méthode Dispose() d'une classe implémentant IDisposable signifie que vous dites à la bibliothèque "J'ai fini avec cet objet. Je ne l'utiliserai plus. Vous pouvez éclaircir si nécessaire." Cela n'est pas spécifique à Entity Framework.

Pour la plupart des classes, les tentatives de continuer à utiliser l'objet après l'appel de Dispose() échoueront, parfois avec une exception explicite vous alertant du problème, parfois par une exception interne causée par l'état de l'objet corrompu. Vous ne devez pas supposer qu'Entity Framework est une exception à cela: après avoir appelé dbContext.Dispose(), vous ne devez plus utiliser le contexte référencé par dbContext.

Cependant, rien ne vous empêche de créer un nouveau contexte immédiatement après:

dbContext.Dispose();
dbContext = new DbContext();

Ce nouveau contexte n'aura absolument aucun souvenir des modifications non enregistrées que vous avez apportées dans l'ancien contexte. Il existe de nombreux bons cas dans lesquels cette approche est la plus pratique.

3
user743382user743382 20 avril 2017 à 18:08

Rien ne sera dans un état instable, donc pas de soucis. Si vous essayez d'appeler context après l'avoir supprimé, vous obtiendrez ObjectDisposedException sinon il est légal de le supprimer si vous n'en avez plus besoin.

0
Andrii Litvinov 20 avril 2017 à 18:18