json.net; serializza object framework quadro (errore di riferimento circolare)

Ho un’entity framework framework quadro che voglio serializzare come object json. Mi sono guardato intorno e ho scoperto che json.net (http://james.newtonking.com/projects/json-net.aspx) dovrebbe essere in grado di serializzare oggetti con riferimenti circolari “out of the box”. Così ho provato a usare

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

Ma sto ancora ricevendo lo stesso errore. Il problema potrebbe essere che ho bisogno di usare ReferenceLoopHandling.Ignore e ContractResolver , ma non sono sicuro di come usarli. Ogni aiuto è molto apprezzato! Grazie

La mia soluzione era semplicemente rimuovere il riferimento principale sulle mie quadro figlio.

Quindi, nel mio modello, ho selezionato la relazione e modificato il riferimento padre in Internal anziché in Public.

Potrebbe non essere una soluzione ideale per tutti, ma ha funzionato per me.

Per aggirare questo ho convertito le mie Entità in codice prima basato su POCO. Per fare ciò, fare clic con il tasto destro all’interno della finestra edmx e selezionare:

Aggiungi elemento di generazione del codice> scheda Codice> EF POCO Entity Generator.

Si noti che potrebbe essere necessario installarlo con nuget se non lo si vede.

In fase di esecuzione, tuttavia, EF aggiunge classi proxy a tali oggetti per scopi di monitoraggio, ma tendono a rovinare il processo di serializzazione. Per evitare ciò, possiamo semplicemente impostare ProxyCreationEnabled su false come segue:

 var context = new YourEntities(); context.Configuration.ProxyCreationEnabled = false; var results = context.YourEntity.Take(100).ToList(); 

È quindi ansible restituire in modo sicuro i dati serializzati JSON.NET omettendo il loop di riferimento predefinito come segue:

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

Un’altra soluzione aggiungerà l’attributo [JsonIgnore] alle proprietà di navigazione.

Per esempio:

 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 Children { get; set; } } 

Ho usato la seguente soluzione per clonare le mie quadro, senza trucchi dove richiesto per quanto riguarda gli attributi dei dati sulle quadro e i riferimenti circolari della mia tabella sono stati preservati. Avevo persino delle quadro che puntavano l’una sull’altra senza problemi. La libreria richiesta per la serializzazione è Json.Net (la dll Newtonsoft.Json).

  private static T CloneObject(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()); } 

Esempio di utilizzo:

  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 

Prova questo: per prima cosa assicurati che poco o il modello abbia DataContract, DataMemeber e rimuovi la parola chiave virtuale..quindi ..

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