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

Entity Framework Discussion :

AddObject() sans SaveChanges() ?


Sujet :

Entity Framework

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Par défaut AddObject() sans SaveChanges() ?
    Bonjour,

    Je programme actuellement un outil utilisant Entity Framework et SQL Server Compact.

    J'ai constaté que lors de l'ajout d'un objet sans ensuite faire appel à la fonction SaveChanges(), l'objet ajouté est ignoré par les requêtes Linq !

    J'ajoute mon objet dans la table CV_Folder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _Entities.CV_Folders.AddObject(Folder.GetEntity());
    Je réalise ma requete Linq:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var Folders = (from F in _Entities.CV_Folders
                select F);
    La variable Folders contient tous les Folders déjà présent dans la base de données mais pas l'élément que je viens d'ajouter !

    Si après la fonction AddObject(), j'exécute la fonction SaveChanges():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _Entities.SaveChanges();
    ... dans ce cas, la requête Linq renvoit ce que j'attend.

    N'y a-t-il pas une solution pour que ma requête Linq travail également avec les objets qui viennent d'être ajoutés sans sauvegarder forcément ?

    Merci de votre aide !
    Raoul

  2. #2
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Ta requête linq c'est du sql qui ramènent des objets qui viennent de la base donc c'est normal qu'il n'y ai pas encore tes objets en mémoire dans le résultat.

    Le plus simple c'est donc de faire le save changes sinon à toi d'ajouter tes objets en mémoire à la main dans le résultats mais je pense pas qu'il y ait de bonne approche pour faire ça ...

    Ca te dérange tant que ca de faire un savechanges() ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Par défaut
    Merci pour ta réponse!

    Je pense que la requête Linq ne ramène pas directement les objets se trouvant en base de données.

    Par exemple si j'exécute le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Entity = (from F in _Entities.CV_Folders
                select F).First();
     
    Entity.Name = "Toto";
     
    Entity = (from F in _Entities.CV_Folders
                select F).First();
    La requete Linq me renvoit bien à la fin Entity.Name = "Toto" alors que je n'ai pas réalisé de SaveChanges()... Les données sont donc en cache ?

    Pourquoi j'arrive à obtenir les objets modifiés mais pas les nouveaux ?

    La fonction SaveChanges() est en effet problématique: dans le programme, l'utilisateur ajoute/modifie/supprime des objets.... Mais il me faut apporter les modifications à la base de données uniquement lorsqu'il décide d'entregistrer ses modifications...

  4. #4
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    c'est un peu plus compliqué que cela ...

    Déjà il n'y a pas d'objets dans la base de données, les objet sont créé par EF dans l'application

    Quand tu fait une requête linq cela génère bien une requete SQL qui va ramener des lignes de la table en question en provenance de la base de données.

    Ensuite EF parcours ces ligne et les transforme en objet ...
    Mais pour éviter d'avoir une duplication d'objets identiques en mémoire il va vérifier si il n'a pas déjà un objet lié au contexte avec le même Id et renvoyer ce dernier si il est présent au lieu d'en créer un nouveau.

    Mais cela ne change pas le fait que la requête renverra uniquement des objets ayant une existence en base.

    La solution pour toi est de mettre en place un système de transaction.

    Si l'utilisateur valide ses modifications tu fais un commit de la transaction, sinon tu fais un rollback

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Par défaut
    Merci pour les explications !
    J'ai suivi ton conseil et j'ai mis en place un BeginTransaction() !

  6. #6
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    De rien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2011, 20h54
  2. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  3. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38
  4. [Kylix] Fiches sans bordure
    Par alex dans le forum EDI
    Réponses: 4
    Dernier message: 28/04/2002, 21h19

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