2009-09-16 8 views
6

私はlinqを使用して行をクローンする必要があります。 。トライは、行のクローンを作成する際db1.Persons.First()クローン()のように、Clone Linqオブジェクトエラー "タイプ 'TestLinq.PersonAddress'のオブジェクトグラフにサイクルが含まれているため、参照トラッキングが無効になっているとシリアル化できません。

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); 
      } 
     } 

しかし、私はこの方法を見つけました

この例外が発生します。「タイプ 'TestLinq.PersonAddress'のオブジェクトグラフにサイクルが含まれており、参照トラッキングが無効になっているとシリアル化できません。

注:私の表は、1つのプライマリキーと1つの一意のインデックスが3フィールド

を含ん含まあなたは私
ハミド

答えて

17

この問題は、linqエンティティが双方向の親アイテムと子アイテム間のリンクを持つ傾向があるために発生します。あなたがテーブルにマッピングされたOrderクラス、および別のテーブルにマップされたのOrderItemクラスを持っていた場合たとえば、あなたはこのように見えるのOrderItemテーブルを期待する:

表のOrderItemをCREATE( ... OrderIdでint型の参照を注文(同上) )

生成LINQのエンティティは次のようになります。

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

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

ため、それのそれぞれがOrderItemの子供たちの間で循環参照があるので、これをシリアル化することはできません。 linq2sql desigerを使用してこれらのクラスを作成している場合は、デザイナーのサーフェスをクリックして「シリアライゼーションモード」を「一方向」に変更して一方向(親から子へ)の参照のみを作成するように指示できます

+1

+1すばらしいです!それを必要とした: – magnus

+1

別の+1、それは束を助けた! – Aligned

+0

これが今できるようになりました... NET 3.5SP1は、DataContractの "IsReference"属性のサポートを追加しました。私はEFがサポートを内蔵していると信じていますが、LINQ2SQLにはL2ST4のようなものが必要です。 –

0

はたぶんPersonAddressのための実際のクラスを投稿
感謝を助けてくださいもらえますか?たとえば、[DataMember]と表示されているアソシエーションプロパティがあるか、または[DataMember]と表示されていないアソシエーションプロパティがあるかどうかは疑問です。この場合、フィールドを調べます。これは、遅延ロードされたメンバー(したがって、データコンテキストへの関連)を持っている場合は、borkかもしれません。

アライメントではなく1つのオブジェクトだけが必要な場合は、シャロークローンを実行する別の方法があります(like so, for example)。

関連する問題