Copie d' objet Linq

jfcecile Messages postés 15 Date d'inscription vendredi 15 février 2008 Statut Membre Dernière intervention 11 février 2009 - 6 oct. 2008 à 14:52
xmox667 Messages postés 357 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 26 décembre 2011 - 9 oct. 2008 à 08:44
Bonjour je cherche à faire une copie d'une ligne d'un table, par le biais de linq,

j'ai essayé d'implémenter la fonction clone dans la classe image de ma base de donnée génerée par sqlmetal
  public Paste()
    {
        this._Setup_Job = default(EntityRef<Setup_Job>);
        OnCreated();
    }

    public object Clone()
    {
       
        return MemberwiseClone();
    }.....

La copie se fait bien mais une exception est générée lors de l'execution apres l'insert de la nouvelle ligne
( Table Paste liée à la table Setup_Job )
private void copyProcessType(Setup_Job New_Setting,Setup_Job Old_Setting)
    {
        int indexPaste = 0;

        foreach (var Old_Paste in Old_Setting.Paste)
        {

           Paste New_Paste = new Paste();

            New_Paste = (Paste)Old_Paste.Clone();

            New_Paste.Process_Type_Id = 0;

            New_Setting.Paste.Insert(indexPaste, New_Paste);
 
            indexPaste++;
        }

    }
*

Pb sur le deuxième passage du foreach

Détails de l'exception: System.InvalidOperationException: EntitySet a été modifié durant l'énumération.
foreach (var Old_Paste in OldPaste)
Ligne 192 : {
....

si je ne fais pas le clone l'insertion se fait parfaitement
mais comme j'ai pas trop envie de copier les champs un par un.

Si vous avez une solution pour copier une ligne de table avec linq

Merci d'avance

3 réponses

xmox667 Messages postés 357 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 26 décembre 2011 4
7 oct. 2008 à 07:21
Salut,
Le MemberwiseClone te créé un nouvel objet qui pointe sur l'ancien (Shallow copy) donc en réalité tu as deux objet lié au même contenu.
Je pense que tu dois faire un Deep copy dans la méthode clone. Cela va te créer un nouvel objet indépendant de la source. Tu auras 2 objets que tu peux modifier indépendamment.

Voici le code pour faire un deep copy:

public object Clone<t>()
{
  using (MemoryStream mem = new MemoryStream())
   {
    Serializer.Serialize(mem, this);
    object tempObj = Serializer.Deserialize<t>(mem);
    return tempObj;
   }
}</t></t>

Dans ta boucle foreach tu fais ceci:
Paste New_Paste = (Paste)Old_Paste.Clone();

A+
0
jfcecile Messages postés 15 Date d'inscription vendredi 15 février 2008 Statut Membre Dernière intervention 11 février 2009
7 oct. 2008 à 09:30
merci pour ta réponse,
j'essaie de l'implémenter
mais je n'arrive pas à trouver la definition de serializer
0
xmox667 Messages postés 357 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 26 décembre 2011 4
9 oct. 2008 à 08:44
Salut,
Désoler pour l'oublie:
BinaryFormatter Serializer = new BinaryFormatter();

Une autre exeple de deep copy:

publicobject Clone()

    {

        MemoryStream ms = new MemoryStream();

        BinaryFormatter bf = new BinaryFormatter();

        bf.Serialize(ms, this);

        ms.Position = 0;

        object obj = bf.Deserialize(ms);

        ms.Close();

        return obj;

    }

A+
0
Rejoignez-nous