Serializar objetos Entity Framework en JSON

asp.net-ajax entity-framework json wcf

Pregunta

Parece que no es posible serializar objetos de Entity Framework en JSON utilizando el DataContractJsonSerializer nativo de WCF o el serializador de JavaScript nativo de ASP.NET. Esto se debe a los problemas de conteo de referencia que rechazan ambos serializadores. También probé Json.NET , que también falla específicamente en un problema de recuento de referencias.


Edición: Json.NET ahora puede serializar y deserializar entidades de Entity Framework .


Mis objetos son objetos de Entity Framework, que están sobrecargados para realizar funciones comerciales adicionales (por ejemplo, autenticación, etc.) y no quiero decorar estas clases con atributos específicos de la plataforma, etc., ya que deseo presentar una API independiente de la plataforma. .

He hecho un blog sobre los pasos individuales que seguí en https://blog.programx.co.uk/2009/03/18/wcf-json-serialization-woes-and-a-solution/

¿Me he perdido algo obvio?

Respuesta aceptada

La forma en que hago esto es proyectando los datos que quiero serializar en un tipo anónimo y serializando eso. Esto garantiza que solo la información que realmente quiero en el JSON se serializa, y no serializo inadvertidamente algo más abajo en el gráfico de objetos. Se parece a esto:

var records = from entity in context.Entities
              select new 
              {
                  Prop1 = entity.Prop1,
                  Prop2 = entity.Prop2,
                  ChildProp = entity.Child.Prop
              }
return Json(records);

Encuentro tipos anónimos casi ideales para esto. A JSON, obviamente, no le importa qué tipo se usó para producirlo. Y los tipos anónimos le brindan total flexibilidad en cuanto a las propiedades y la estructura que coloca en el JSON.


Respuesta popular

Microsoft cometió un error en la forma en que convirtió los objetos EF en contratos de datos. Incluían las clases base y los enlaces de vuelta.

Su mejor apuesta será crear clases de objetos de transferencia de datos equivalentes para cada una de las entidades que desea devolver. Estos incluirían solo los datos, no el comportamiento, y no las partes específicas de EF de una entidad. También crearías métodos para traducir desde y hacia tus clases DTO.

Sus servicios devolverían los objetos de transferencia de datos.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué