Serialisieren von Entity Framework Probleme

Wie mehrere andere Leute, ich habe Probleme mit der Serialisierung Entity-Framework-Objekte, so dass ich senden können Sie die Daten über AJAX im JSON-format.

Ich habe den folgenden server-side-Methode, die ich bin versucht zu rufen, die mit AJAX durch jQuery

[WebMethod]
public static IEnumerable<Message> GetAllMessages(int officerId)
{

        SIBSv2Entities db = new SIBSv2Entities();

        return  (from m in db.MessageRecipients
                        where m.OfficerId == officerId
                        select m.Message).AsEnumerable<Message>();
}

Aufruf per AJAX Ergebnisse in dieser Fehler:

A circular reference was detected while serializing an object of type \u0027System.Data.Metadata.Edm.AssociationType

Ist wegen der Art, wie das Entity Framework erstellt zirkuläre Referenzen zu allen Objekten relevanten und zugänglichen server-Seite.

Stieß ich auf den folgenden code aus ( http://hellowebapps.com/2010-09-26/producing-json-from-entity-framework-4-0-generated-classes/ ), die behauptet, dieses problem zu umgehen, durch die Begrenzung der maximalen Tiefe für Referenzen. Ich habe den folgenden code, denn ich hatte es zu zwicken etwas, um es zu bekommen Arbeit (Alle Spitzen Klammern fehlen, den code auf der website)

using System.Web.Script.Serialization;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System;


public class EFObjectConverter : JavaScriptConverter
{
  private int _currentDepth = 1;
  private readonly int _maxDepth = 2;

  private readonly List<int> _processedObjects = new List<int>();

  private readonly Type[] _builtInTypes = new[]{
    typeof(bool),
    typeof(byte),
    typeof(sbyte),
    typeof(char),
    typeof(decimal),
    typeof(double),
    typeof(float),
    typeof(int),
    typeof(uint),
    typeof(long),
    typeof(ulong),
    typeof(short),
    typeof(ushort),
    typeof(string),
    typeof(DateTime),
    typeof(Guid)
  };

  public EFObjectConverter( int maxDepth = 2,
                            EFObjectConverter parent = null)
  {
    _maxDepth = maxDepth;
    if (parent != null)
    {
      _currentDepth += parent._currentDepth;
    }
  }

  public override object Deserialize( IDictionary<string,object> dictionary, Type type, JavaScriptSerializer serializer)
  {
    return null;
  }     

  public override IDictionary<string,object> Serialize(object obj, JavaScriptSerializer serializer)
  {
    _processedObjects.Add(obj.GetHashCode());
    Type type = obj.GetType();
    var properties = from p in type.GetProperties()
                      where p.CanWrite &&
                            p.CanWrite &&
                            _builtInTypes.Contains(p.PropertyType)
                      select p;
    var result = properties.ToDictionary(
                  property => property.Name,
                  property => (Object)(property.GetValue(obj, null)
                              == null
                              ? ""
                              :  property.GetValue(obj, null).ToString().Trim())
                  );
    if (_maxDepth >= _currentDepth)
    {
      var complexProperties = from p in type.GetProperties()
                                where p.CanWrite &&
                                      p.CanRead &&
                                      !_builtInTypes.Contains(p.PropertyType) &&
                                      !_processedObjects.Contains(p.GetValue(obj, null)
                                        == null
                                        ? 0
                                        : p.GetValue(obj, null).GetHashCode())
                              select p;

      foreach (var property in complexProperties)
      {
        var js = new JavaScriptSerializer();

          js.RegisterConverters(new List<JavaScriptConverter> { new EFObjectConverter(_maxDepth - _currentDepth, this) });

        result.Add(property.Name, js.Serialize(property.GetValue(obj, null)));
      }
    }

    return result;
  }

  public override IEnumerable<System.Type> SupportedTypes
  {
    get
    {
      return GetType().Assembly.GetTypes();
    }
  }

}

Aber auch, wenn Sie diesen code in folgender Weise:

    var js = new System.Web.Script.Serialization.JavaScriptSerializer();
    js.RegisterConverters(new List<System.Web.Script.Serialization.JavaScriptConverter> { new EFObjectConverter(2) });
    return js.Serialize(messages);

Ich bin immer noch zu sehen, die A circular reference was detected... Ausnahme geworfen!

  • mögliche Duplikate von Serialize Entity-Framework-Objekte in JSON
  • Diese Frage geht mit anonymen Typen als eine Lösung, in der Erwägung, dass nehme ich einen anderen Ansatz in der Lösung, die ich versuche, zu arbeiten
  • Gibt es einen Grund, Sie sind nicht glücklich, dass die Projektion auf einen anonymen Typ (oder ein statisch definierten Typ). Sicherlich, die Komplexität Ihrer Art braucht Abflachung in irgendeiner Weise? Ich bin mir nicht sicher, warum die genannten Konverter nicht funktionieren - sind Sie glücklich zu post den code für die 'Nachricht' in der Klasse, die Sie versuchen zu serialisieren? Auch - du bist immer noch das zurückstellen der Abfrage-Ausführung in der LINQ-Abfrage, versuchen calling "ToList ()" nach dem 'AsEnumerable ()' - Aufruf.
  • David - es gibt viele Gründe, nicht zu wollen-Projekts auf jede einzelne Person zugreifen. TROCKEN für einen start.. betrachten Sie haben ein Unternehmen mit 40 einfache Eigenschaften und nur 1 complex type-Eigenschaft erzeugt einen Zirkelbezug!
Schreibe einen Kommentar