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 :

Comment faire un update 'externe' via l'entity framework / linq to entities ?


Sujet :

Entity Framework

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Comment faire un update 'externe' via l'entity framework / linq to entities ?
    Bonjour,

    j'ai passé pas mal de temps à chercher comment mettre à jour des champs d'autres tables à celle courante via l'entity framework, sans succès, c'est pourquoi je me tourne vers vous.

    Le contexte est simple, j'ai une table lot, livraison et parcelles. Un lot contient une ou plusieurs livraison (1-n) et un ou plusieurs lots contiennent une ou plusieurs parcelles (n-n).

    Pour l'insertion tout se passe bien, par contre pour la modification je ne sais pas comment m'y prendre,


    - Lorsque je met à jour les parcelles ou les livraisons comme si de rien n'était j'ai un message d'erreur qui me dit que l'objet existe déjà (logique je veux juste qu'il mette à jour), idem lorsque je fais un clear avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    lot.Parcelles.Clear();
    entityModel.SaveChanges();
    foreach (Parcelles par in parcelles)
    {
        Parcelles pc = entityModel.Parcelles.Where(p => p.ParcelleID == par.ParcelleID).First();
        lot.Parcelles.Add(pc);
    }
    - Lorsque je fais un delete des parcelles ou des livraisons avant de les insérer j'ai également un message d'erreur sur la FK des parcelles (logique aussi il essaye de me supprimer la parcelle, or je veux juste supprimer le lien de la table intermédiaire n-n entre les lots et les parcelles)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    entityModel.DeleteObject(lotExistant.Parcelles.First());
    entityModel.SaveChanges();
    foreach (Parcelles par in parcelles)
    {
        Parcelles pc = entityModel.Parcelles.Where(p => p.ParcelleID == par.ParcelleID).First();
        lot.Parcelles.Add(pc);
    }
    Il faudrait que je puisse supprimer juste les liens ou quelque chose dans le style...

    voici une partie du code que j'utilise pour la mise à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    //...
    IEnumerable<Lots> res;
    res = from lots in entityModel.Lots.Include("Parcelles").Include("Livraisons")
             where lots.LotID == lot.LotID
             select lots;
     
    if (res.Count() > 0) // update
    {
       Lots lotExistant = res.First();
       lotExistant.LotReporte = lot.LotReporte;
       lotExistant.EstActif = true;
       lotExistant.DateModification = DateTime.Now;
       lotExistant.ModifiePar = userName;
       // etc
       // lotExistant.Parcelles = ??
       // lotExistant.Livraisons = ??
    }
     
    entityModel.SaveChanges();
    //...
    Merci d'avance pour vos lumières.

  2. #2
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Je te conseille le Webcast de Julie Lerman : http://msdn.microsoft.com/en-us/data/ee712907

    Quand tu fais une modification, par besoin de ré-ajouter l'objet, il te suffit de sauvegarder le contexte.


    EDIT : Peux-tu commenter ce code que je comprenne bien ce que tu veux faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lot.Parcelles.Clear();
    entityModel.SaveChanges();
    foreach (Parcelles par in parcelles)
    {
        Parcelles pc = entityModel.Parcelles.Where(p => p.ParcelleID == par.ParcelleID).First();
        lot.Parcelles.Add(pc);
    }
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse,
    voici le code commenté

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lot.Parcelles.Clear(); // je retire le lien entre les lots et les parcelles (ou les enregistrements)
    entityModel.SaveChanges(); // je sauvegarde en DB ma modification
    foreach (Parcelles par in parcelles) // Je boucle sur les nouvelles parcelles à ajouter (celles d'avant ont été effacée)
    {
        Parcelles pc = entityModel.Parcelles.Where(p => p.ParcelleID == par.ParcelleID).First();
        lot.Parcelles.Add(pc); // J'ajoute les nouvelles parcelles une par une
    }

    Mais évidemment il y a une différence entre ma logique et ce que fait vraiment ce code

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Personne n'a une idée ?
    Ca doit être courant pourtant de mettre d'autres éléments d'une autre table à jour

    Je viens d'essayer de détacher du context mes élements puis de les attacher mais ça ne semble pas fonctionner (même si ça ne se plante pas)

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    foreach (Parcelles p in lotExistant.Parcelles.ToList()) // je boucle sur chacune des parcelles existantes pour detacher chacune d'elle une par une
    {
         entityModel.Detach(p);
    }
     
    lotExistant.Parcelles.Clear(); // j'efface les liens entre les lots et les parcelles
     
    entityModel.SaveChanges(); // j'enregistre les modif
     
    foreach (Parcelles par in parcelles) // Je boucle sur les nouvelles parcelles à ajouter au lot
    {
         Parcelles pc = entityModel.Parcelles.Where(p => p.ParcelleID == par.ParcelleID).First();
         //lot.Parcelles.Add(pc); // Cette ligne plante, la parcelle existe déjà dans le contexte...
         entityModel.Attach(pc); // J'attache chacune des nouvelles parcelles une par une
    }
     
    entityModel.SaveChanges(); // j'enregistre les modif

  5. #5
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut une idée
    Voici un bout de code qui marche dans une de mes applis

    J'ai mis ce bout de code pour centraliser mes données, dans une classes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public Shared LesDatas As New FileTransfertEntities 'Nom du conteneur d'entité

    Une MiseADisposition peut avoir plusieurs Fichier mais un fichier peut n'avoir qu'une MiseADisposition
    Un Fichier peut avoir plusieurs Destinataire mais un Destinataire peut n'avoir qu'un Fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     Dim LaMAD As New MiseADisposition
     LaMAD.ID = New Guid(FolderInfo.Name)
     LesDatas.MiseADisposition.AddObject(LaMAD)
     
     Dim LeFic As New Fichier
    LeFic.ID = Guid.NewGuid
    LeFic.Nom = f.Name
    LeFic.Extension = f.Extension
    LeFic.MiseADisposition = LaMAD
    LesDatas.Fichier.AddObject(LeFic)
     
    For Each dest In lstDest
      Dim LeDest As New Destinataire
      LeDest.ID = Guid.NewGuid
      LeDest.Fichier = LeFic
      LeDest.Mail = dest
      LesDatas.Destinataire.AddObject(LeDest)
    Next
    LesDatas.SaveChanges()
    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

Discussions similaires

  1. Expression blend /wpf Comment faire une lueur externe sur bordure ?
    Par bolandfranck dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 22/05/2008, 16h59
  2. Comment faire l'Update
    Par andy38 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/02/2007, 11h51
  3. Réponses: 1
    Dernier message: 07/09/2006, 16h03
  4. comment faire ce update svp?
    Par iam dans le forum Bases de données
    Réponses: 6
    Dernier message: 03/07/2006, 13h56
  5. [VB6] Comment faire un update sur des textbox qui sont créés
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 27
    Dernier message: 16/02/2006, 14h52

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