2011-11-02 10 views
11

私はjsonオブジェクトとしてシリアル化したいエンティティフレームワークエンティティを持っています。私は周りを見回し、json.net(http://james.newtonking.com/projects/json-net.aspx)が循環参照を持つオブジェクトを "そのまま"シリアライズできなければならないことを知りました。だから私は使用しようとしましたjson.net;

string json = JsonConvert.SerializeObject(/* my ef entity */); 

しかし、私はまだ同じエラーが発生しています。問題は、ReferenceLoopHandling.IgnoreContractResolverを使用する必要がありますが、使用方法がわからないことがあります。どんな助けでも大歓迎です!ありがとう

+0

可能重複(http://stackoverflow.com/questions/657939/serialize-entity-framework-objects-into- json) –

+2

@CraigStuntzいいえ、私は新しいオブジェクトにmaunallyプロパティをマップする必要はありません。そして、これをJSON.NETを使ってどのように行うことができるか質問しています – Johan

+0

提案されたソリューションはJSON.NETで動作します。代入文より循環参照を扱うのであれば、それはあなた次第です。しかし、JSON.NETは、他のソリューションが動作しないことを意味するものではありません。 –

答えて

2

私の解決策は、単に私の子エンティティの親参照を削除することでした。

私のモデルでは、関係を選択し、親参照を公開ではなく内部に変更しました。

すべてにとって理想的な解決策ではないかもしれませんが、私のために働いてください。

14

これを回避するために、エンティティをPOCOベースのコードファーストに変換しました。これを行うには、edmxウィンドウ内を右クリックして、以下を選択します。

コード生成項目>コードタブ> EF POCOエンティティジェネレータを追加します。

ヌゲットが表示されていない場合は、インストールする必要があることに注意してください。

実行時に、EFは追跡のためにこれらのオブジェクトにプロキシクラスを追加しますが、シリアライゼーションプロセスが混乱する傾向があります。

return JsonConvert.SerializeObject(results, Formatting.Indented, 
    new JsonSerializerSettings { 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
    }); 
+4

+1 ReferenceLoopHandling.Ignore' - 私の日を保存しました! – nrodic

1

はこれを試してみてください:

var context = new YourEntities(); 
context.Configuration.ProxyCreationEnabled = false; 

var results = context.YourEntity.Take(100).ToList(); 

あなたはその後、安全に次のようにループするデフォルトの参照を省略してJSON.NETシリアライズされたデータを返すことができる次のようにこれを防ぐために、我々は単にfalseにProxyCreationEnabled設定することができますファースト確かPOCOまたはモデルのDataContract、DataMemeberおよび仮想キーword..thenを削除している作る。..

public string Get() 
    { 
     var list = _languageRepository.GetMany(l => l.LanguageTrans.FirstOrDefault().CultureCode == "en").ToList(); 

     string json = JsonConvert.SerializeObject(list, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects }); 

     return json; 
    } 
+0

この方法で、関連するエンティティを保持することができます。 – Bryant

9

別の解決策は、[JsonIgnore] attributを追加していく予定あなたのナビゲーションプロパティに。例えば

using System; 
using System.ComponentModel.DataAnnotations.Schema; 

[Serializable] 
public class Entity 
{ 
    public int EntityID { get; set; } 
    public string EntityName { get; set; } 

    [JsonIgnore] 
    public virtual Parent Parent { get; set; } 
    [JsonIgnore] 
    public virtual List<Child> Children { get; set; } 
} 
+0

これは正しい答えです。エンティティは互いに参照する必要があります。しかし、子のマスターエンティティプロパティを無視する必要があります。 – Darren

+1

しかし、子要素の観点から関係を表示したいのですが? –

6

私は、私のエンティティのクローンを作成するために必要なに関するデータは、エンティティの属性と私のテーブル循環参照が保存しまった何のトリックを、次のソリューションを使用していません。私はエンティティにも何か問題があるのを指摘していました。 シリアル化に必要なライブラリはJson.Net(Newtonsoft.Json dll)です。

private static T CloneObject<T>(T obj) 
    { 
     if (obj == null) 
      return obj; 
     string ser = JsonConvert.SerializeObject(obj, Formatting.Indented, 
      new JsonSerializerSettings() { 
           NullValueHandling = NullValueHandling.Ignore, 
           MissingMemberHandling = MissingMemberHandling.Ignore, 
           ReferenceLoopHandling = ReferenceLoopHandling.Ignore}); 
     return (T) JsonConvert.DeserializeObject(ser, obj.GetType()); 
    } 

使用例:[JSONにシリアライズEntity Frameworkのオブジェクト]の

protected object CopyObj(Object obj) 
    { 
     return CloneObject(obj); 
    } 
    var cust1 = this.cts.Customers().Where(cc => cc.Id == 3).Include(cc => cc.Addresses).FirstOrDefault(); 
    var cust2 = CopyObj(cust1) as Customers; 
    //Cust2 now includes copies of the customer record and its addresses