2009-09-16 15 views
6

I Nécessité de cloner une ligne à l'aide de linq. je l'ai trouvé cette méthode.Objet Clone Linq Erreur "Le graphique d'objet pour le type 'TestLinq.PersonAddress' contient des cycles et ne peut pas être sérialisé si le suivi des références est désactivé."

public static T Clone<T>(this T source) 
     { 
      var dcs = new System.Runtime.Serialization 
       .DataContractSerializer(typeof(T)); 
      using (var ms = new System.IO.MemoryStream()) 
      { 
       dcs.WriteObject(ms, source); 
       ms.Seek(0, System.IO.SeekOrigin.Begin); 
       return (T)dcs.ReadObject(ms); 
      } 
     } 

mais lorsque je tente de cloner la ligne, comme db1.Persons.First() Clone();

Je reçois cette exception: "Le graphique d'objet pour le type 'TestLinq.PersonAddress' contient des cycles et ne peut pas être sérialisé si le suivi des références est désactivé."

Note: Mon tableau contient 1 clé primaire et 1 index unique comprennent 3 champ

Pouvez-vous s'il vous plaît me aider
Merci
Hamid

Répondre

17

Ce problème se produit car les entités linq ont tendance à avoir des liens entre les éléments parents et enfants dans les deux directions. Par exemple, si vous aviez une classe d'ordre mis en correspondance avec une table et une classe de OrderItem mis en correspondance avec une autre table, vous attendez la table OrderItem pour ressembler à ceci:

CREATE TABLE OrderItem ( ... OrderId int références ordre (Id) )

Les entités LINQ générées seraient alors ressembler à ceci:

public class Order 
{ 
    //other members 
    public EntitySet<OrderItem> OrderItems { get; } 
} 

public class OrderItem 
{ 
    //other members 
    public Order Order { get; } 
} 

ce ne peut pas être sérialisé car il y a une référence circulaire entre une commande et chacun il est des enfants OrderItem. Si vous utilisez linq2sql desiger pour créer ces classes, vous pouvez lui indiquer de créer uniquement des références dans une direction (du parent vers l'enfant) en cliquant sur la surface du concepteur et en changeant le 'Mode de sérialisation' sur 'Unidirectionnel

+1

+1 Génial! nécessaire que :) – magnus

+1

un autre +1, cela a aidé un groupe !! – Aligned

+0

Cela peut maintenant être fait ... NET 3.5SP1 ajoute le support de l'attribut "IsReference" dans DataContract. Je crois que EF a le support intégré, mais LINQ2SQL a besoin de quelque chose comme L2ST4. –

0

poster Peut-être la classe réelle pour PersonAddress? Je me demande, par exemple, si vous avez une propriété d'association marquée [DataMember], ou pas [DataMember] s du tout; Dans ce cas, il se penche sur les champs - qui pourraient être bork si vous avez un membre paresseux (et donc une association au contexte de données).

Notez que si vous voulez seulement un objet (pas des associations), il existe d'autres façons de faire un clone superficiel - like so, for example.

Questions connexes