2011-11-02 9 views
5

He estado teniendo problemas con las referencias circulares al convertir entidades EF a objetos json. He encontrado una solución que funciona para mí, pero me gustaría saber lo que está sucediendo realmente cuando estoy añadiendoseralizando entidades EF; ¿Deshabilita la creación de Proxy y la carga lenta?

context.ContextOptions.ProxyCreationEnabled = false; 

y/o

context.ContextOptions.LazyLoadingEnabled = false; 

El primero parece ser suficiente para obtener una objeto json unidimensional ¿Debo usar ambos? ¿Y qué es lo que realmente hacen? ¿Hay alguna manera más inteligente de evitar esto? Gracias

+0

Noté en su última publicación que está usando JavaScriptSerializer. ¿Hay alguna razón específica para esto? ¿Esto es para una aplicación web? Creo que debería adoptar un enfoque diferente para obtener su json, como DataContractJsonSerializer o la biblioteca Json.NET. –

+0

@SeanThoman He intentado usar json.net, pero todavía obtuve la excepción de referencia circular. Esta es una aplicación de formularios web asp.net 4.0 normal. ¿Tiene algún ejemplo utilizando el DataContractJsonSerializer? – Johan

Respuesta

6

La primera línea desactiva la generación del tiempo de ejecución de la clase que hereda de su clase de entidad. Esta clase realmente se usa durante el tiempo de ejecución. No es tu clase Esta clase generada en tiempo de ejecución probablemente no sea Serializable y es por eso que esta línea (que desactiva la generación de proxy) hace que la serialización funcione.

La segunda línea desactiva la carga diferida. Entonces, digamos que tiene una entidad principal y una entidad secundaria. Cuando solicita Parent, no carga Children cuando está activada la carga diferida. Cuando está apagado cada vez que carga Parent, carga todos sus elementos secundarios. Creo que esto es algo con lo que debes familiarizarte si estás usando EF.

Editar: Si hay un problema con la referencia circular, entonces debe desactivar la carga diferida. Luego, cuando serialice Parent, no tratará de serializar Children que tienen referencia a Parent (creando una referencia circular)

+0

De acuerdo, pero debería deshabilitar la carga lenta, haga el truco solo entonces? – Johan

+0

Como dijiste. La primera línea es suficiente. –

+0

Sí, simplemente no entiendo por qué desactivar la carga lenta es suficiente. ¿No debería eso eliminar las relaciones con otras entidades? – Johan

Cuestiones relacionadas