将实体框架对象序列化为JSON

Joh*_*han 6 javascript c# json entity-framework

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但是当我尝试时HttpContext.Current.Response.Write(serializer.Serialize(system));出现以下错误:

序列化类型为'System.Data.Metadata.Edm.AssociationType的对象时,检测到循环引用

我想要的是一个代表完整as_system对象的json对象,因此我不必手动映射每个属性。有什么办法解决这个问题?谢谢!

Ham*_*loo 5

如果要将序列化实体框架对象成JSON,可以使用http://www.newtonsoft.com中的 JSON.NET 。为此,请从nuget安装JSON.NET并使用以下代码示例:

return Newtonsoft.Json.JsonConvert.SerializeObject(results, Formatting.Indented, 
new JsonSerializerSettings { 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
});
Run Code Online (Sandbox Code Playgroud)

ReferenceLoopHandling.Ignore可以防止循环引用错误。

  • 我认为这会阻止循环引用,但不会阻止不必要地加载不需要的相关实体。 (4认同)

Mar*_*ell 4

听起来 EF 并没有给你一个ASSystem,而是给你一些微妙的动态子类,并带有一些 EF goo 。如果这是正确的,我认为这里要做的最简单的事情使用AutoMapper之类的东西来获取非 EF 副本(进入实例new ASSystem(),不受 EF 影响)。但是,有一些替代方案:

  • 你可以尝试标记ASSystemsealed,取消 EF 自身注入的能力
  • 你编写一个自定义转换器并注册它- 但这可能比映射更多的工作