IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

[EF] Annuler changements sur une entité


Sujet :

Accès aux données

  1. #1
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut [EF] Annuler changements sur une entité
    Bonjour à tous et merci d'avance,

    Je recherche un moyen d'annuler les changements sur un objet présent dans le contexte. En faite, j'ai un objet modifié en mémoire, j'aimerais lui restituer d'une façon ou d'une autre, son état initial (celui issue de la base).

    Pour info mon objet et attaché à un contexte, et je souhaite réinitialisaer également les références vers d'autres objets.

    Si j'effectue une nouvelle requête, les modifications sont gardé. Si j'utilise Context.Refresh, les références ne sont pas mise à jour.

    Quelqu'un aurait une idée ?

  2. #2
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Bonjour,

    Une solution serait de faire un Refresh sur ton entités et sur toutes les entités en relation, comme tu l'as cité.

    Sinon, peut-être qu'il est possible d'enlever les entrées adéquates dans le manageur d'état du contexte.

    Voici un exemple où je récupère l'objectStateEntry d'une entité et je le supprime (pas vraiment testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bdd.DeleteObject(client);
    ObjectStateEntry entry = null;
    bdd.ObjectStateManager.TryGetObjectStateEntry(client.EntityState, out entry);
    entry.Delete();
    Dans tous les cas, je pense qu'il faut que tu itères sur tes entités pour supprimer les modifications.

    Une dernière solution serait de supprimer toutes les entrées du manageur d'états.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Oula, très mauvaise idée de faire Delete sur l'ObjectStateEntry !
    Ca ne supprime pas l'ObjectStateEntry, mais ça marque l'entité comme supprimée !!! autrement dit, au prochain SaveChanges, ça va supprimer l'entité de la base...
    (à moins bien sûr que la doc soit erronée, ce ne serait pas la première fois... )

    Je pense que la bonne méthode est d'appeler Refresh sur toutes les entités qui ont changé. Je verrais bien quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    EntityState changedStates = EntityState.Added | EntityState.Deleted | EntityState.Modified;
    foreach(ObjectStateEntry entry in bdd.ObjectStateManager.GetObjectStateEntries(changedStates))
    {
        bdd.Refresh(RefreshMode.StoreWins, entry.Entity);
    }

  4. #4
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Mhh

    Effectivement, j'ai été séduit par le nom de la méthode ...

    J'ai effectué encore quelques recherches, et effectivement je ne vois que la méthode Refresh du contexte.

    D'ailleurs, c'est marrant, ou pas, qu'on puisse pas avoir directement accès aux modifications en attente stockées dans le manageur d'états ...

    C'est bien dommage

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Paul Musso Voir le message
    D'ailleurs, c'est marrant, ou pas, qu'on puisse pas avoir directement accès aux modifications en attente stockées dans le manageur d'états ...

    C'est bien dommage
    Ben justement, c'est ce que fait GetObjectStateEntries... mais c'est vrai qu'une méthode GetChanges comme dans un DataSet aurait été plus pratique

    PS: il y avait une petite erreur dans mon code, c'est corrigé...

  6. #6
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Points : 443
    Points
    443
    Par défaut
    Euh,

    ce que je voulais dire c'est qu'on puisse pas supprimer les entrées directement ...

Discussions similaires

  1. Suivre les changements sur une vue
    Par LEK dans le forum SQL
    Réponses: 10
    Dernier message: 03/12/2009, 16h27
  2. Detecter un changement sur une ligne dans une JTable
    Par RR instinct dans le forum Composants
    Réponses: 8
    Dernier message: 10/04/2008, 12h58
  3. Changement sur une classe derivee
    Par Seth77 dans le forum C#
    Réponses: 1
    Dernier message: 24/12/2007, 12h46
  4. problème de changement sur une même feuille
    Par tchimou dans le forum Delphi
    Réponses: 4
    Dernier message: 03/04/2007, 13h39
  5. Ecouter des changements sur une page
    Par eXiaNazaire dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/12/2006, 20h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo