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

Linq Discussion :

[C#][Linq]Copier un objet


Sujet :

Linq

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut [C#][Linq]Copier un objet
    Bonjour,

    J'ai deux tables identiques : A et B. (Par exemple, des facturiers)

    Je permets l'importation d'objets de A vers B (par exemple: un client)

    Si je fais un B.addToClient, ça ne fonctionne pas, puisque le client lu sur A reste attaché à A.

    Je n'ai trouvé comme méthode que ceci :

    - Créer un nouveau client
    - Copier tous les champs du client lu dans A vers le nouveau client
    - Faire un addToClient avec le nouveau client
    - Puis B.SaveChanges()

    Ca fonctionne, mais c'est lourd de recopier tous les champs du client.

    J'ai essayé diverses méthodes, en utilisant detach et attach par exemple, mais à chaque fois j'obtiens une erreur (différente).

    Ma question est : y-a-t-il un moyen de récuperer un élément d'une table d'une base A, de lui modifier certains champs (sans influencer la base A), et de sauver l'élément modifié dans B, sans devoir recopier tous les champs non modifiés?

    Bref un truc du genre, travaillant uniquement sur le client lu, sans en créer un clone :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var clientimport = (from c in A.Client
                              where c.Id = identificateur
                              select c).FirstOrDefault();
     
    clientimport.Id = nouvelId;
     
    B.AddToClient(clientimport);
    SaveChanges();
    Mais complété pour que ça fonctionne réellement.

    Pour l'instant, je fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var clientimport = (from c in A.Client
                              where c.Id = identificateur
                              select c).FirstOrDefault();
     
    clientExport = new Client();
     
    clientExport.copieAPartirDe(clientImport);  // copie bêtement tous les champs
    clientExport.Id = nouvelID
    B.AddToClient(clientExport);
    SaveChanges();

    Merci d'avance
    Claude

  2. #2
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Tu peux faire un clone de ton objet en passant par la sérialisation/désérialisation:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MemoryStream ms = new MemoryStream();
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Bonjour,

    Ok, merci.

    Mais il n'y a pas une méthode pour utiliser l'objet lui-même, sans en faire une copie?

    Claude

  4. #4
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    oups, il me manquait un bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, monObjet);
            ms.Position = 0;
            object obj = bf.Deserialize(ms);
            ms.Close();
            return obj;
    Un tuto sur le sujet:
    http://www.developpez.net/forums/d74...t/#post4300878
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Bonjour,


    Citation Envoyé par The_badger_man Voir le message
    oups, il me manquait un bout de code
    Ce n'est pas grave, j'avais compris , j'utilise déjà ce genre de technique pour stocker des objets ou des listes d'objets dans des zones BLOB :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            public static byte[] ObjetToTableau(this Object objet)
            {
                if (objet == null) return null;             // si on ne passe rien, on renvoie null
                var bf = new BinaryFormatter();             // créer un objet de conversion
                var ms = new MemoryStream();                // créer un flux de fichier mémoire
                bf.Serialize(ms, objet);                    // sérialise l'objet en mémoire
                var result = ms.ToArray();                  // transforme la mémoire en un tableau d'octets
                ms.Close();                                 // ferme le flux mémoire.
                return result;                              // retourne le tableau
            }
    Et évidemment la réciproque pour l'autre sens.

    Et si je mets les deux ensemble, j'obtiens l'équivalent de ton code.

    Par contre, tu as l'air aussi distrait que moi, parce que ton lien pointe sur ce post-ci

    Pour recopier, je n'ai pas de problème, en fait tout fonctionne.
    C'est juste que je trouvais peu élégant de récupérer un object d'une table, et de devoir le recopier pour pouvoir le stocker dans une autre table.

    Plutôt que ceci :

    Lire objet a dans table A -> créer objet b = objet a -> entrer objet b dans table B

    j'aurais préféré faire ça :

    lire objet a dans table A -> placer a dans table B.

    J'avais essayé avec B.detach(a), mais ça me génère de toutes façons une autre erreur lorsque je tente d'entrer a dans B.

    Mais si c'est impossible, ça ne me pose pas de problème existentiel, c'est juste que tout cloner me semble lourd (Si j'importe des éléments, je peux en avoir des milliers, et il faut tous les copier).

    Merci
    Claude

  6. #6
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Par défaut
    Le bon lien: http://floriannouri.developpez.com/t...t/copy-object/


    Si c'est juste pour copier d'une table à l'autre, ce n'est peut-être pas la peine de charger les objets via Linq. Pourquoi ne pas passer pas une bonne vieille procédure stockée (que tu pourras appeler par Linq) ?
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Bonjour

    Si c'est juste pour copier d'une table à l'autre, ce n'est peut-être pas la peine de charger les objets via Linq. Pourquoi ne pas passer pas une bonne vieille procédure stockée (que tu pourras appeler par Linq)
    C'est un programme de facturation complet, qui tourne avec SqLite en linq to entities. Il est bien avancé et sera dispo en open-source une fois terminé (c'est mon habitude).

    La copie, c'est juste pour pouvoir importer des factures, clients, articles, conditions de vente, coordonnées d'entreprise etc d'un facturier à l'autre.

    Merci pour le lien

    Claude

Discussions similaires

  1. copier un objet (instance ?)
    Par panthere_noire dans le forum Général Python
    Réponses: 16
    Dernier message: 20/09/2008, 23h32
  2. Copier un objet en VB
    Par decondelite dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/09/2008, 13h05
  3. Copier un objet par valeur ?
    Par Totanne dans le forum VB.NET
    Réponses: 4
    Dernier message: 25/03/2008, 14h22
  4. [C#]Comment puis-je copier un objet ?
    Par lanuage dans le forum C#
    Réponses: 12
    Dernier message: 03/11/2006, 20h11
  5. Copier des objets d'un formulaire à un autre en VBA
    Par vincentdacol dans le forum Access
    Réponses: 1
    Dernier message: 24/04/2006, 14h18

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