Johan Johan - 6 months ago 43
JSON Question

Serializing Entity Framework Objects into JSON

public class GenericHandler : IHttpHandler
{
public class ASSystem
{
public string SID { get; set; }
public string Description { get; set; }
public string SystemName { get; set; }
}

public class ErrorObj
{
public string ErrorMessage { get; set; }
}

public void ProcessRequest(HttpContext context)
{
HttpContext.Current.Response.ContentType = "application/json";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;

string query = HttpContext.Current.Request.QueryString["SID"];


SOFAEntities ctx = new SOFAEntities();
JavaScriptSerializer serializer = new JavaScriptSerializer();

try
{
AS_SYSTEM system = ctx.AS_SYSTEM.Where(s => s.SYSTEM_ID == query).First() as AS_SYSTEM;

if (system != null)
{
ASSystem sys = new ASSystem() { SID = system.SYSTEM_ID, Description = system.DESCRIPTION, SystemName = system.SYSTEM_NAME };
HttpContext.Current.Response.Write(serializer.Serialize(sys));
}
}
catch (Exception e)
{
HttpContext.Current.Response.Write(serializer.Serialize(new ErrorObj() { ErrorMessage = e.Message }));
}





}

public bool IsReusable
{
get
{
return false;
}
}
}


This works, but when i try with
HttpContext.Current.Response.Write(serializer.Serialize(system));
i get the following error:


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


What i wanted was a json object representating the complete as_system object, so i dont have to map each property manually. Is there any way to solve this? Thanks!

Answer

It sounds like EF is not giving you a ASSystem, but rather some subtle dynamic subclass of that with some EF goo. If that is correct, I would argue the simplest thing to do here is to use something like AutoMapper to get a non-EF copy (into a new ASSystem() instance, untouched by EF). However, a few alternatives:

  • you could try marking ASSystem as sealed, taking away EF's ability to inject itself
  • you you write a custom converter and register it - this is probably more work than mapping, though