He estado experimentando con la creación de un sitio web que aprovecha MVC con JSON para mi capa de presentación y el marco de Entidad para el modelo de datos / base de datos. My Issue entra en juego con la serialización de mis objetos Model en JSON.
Estoy usando el primer método de código para crear mi base de datos. Al hacer el primer método de código, una relación uno a muchos (padre / hijo) requiere que el hijo tenga una referencia de regreso al padre. (Código de ejemplo puede ser un error tipográfico pero obtienes la imagen)
class parent
{
public List<child> Children{get;set;}
public int Id{get;set;}
}
class child
{
public int ParentId{get;set;}
[ForeignKey("ParentId")]
public parent MyParent{get;set;}
public string name{get;set;}
}
Cuando se devuelve un objeto "primario" a través de un JsonResult, se genera un error de referencia circular porque "secundario" tiene una propiedad de la clase principal.
He probado el atributo ScriptIgnore pero pierdo la capacidad de mirar los objetos secundarios. Tendré que mostrar información en una vista padre-hijo en algún momento.
He tratado de hacer clases base para padres e hijos que no tienen una referencia circular. Lamentablemente, cuando intento enviar el baseParent y el baseChild, JSON Parser los lee como sus clases derivadas (estoy bastante seguro de que este concepto se me escapa).
Base.baseParent basep = (Base.baseParent)parent;
return Json(basep, JsonRequestBehavior.AllowGet);
La única solución que se me ocurrió es crear modelos "Ver". Creo versiones simples de los modelos de bases de datos que no incluyen la referencia a la clase principal. Cada uno de estos modelos de vista tiene un método para devolver la Versión de la base de datos y un constructor que toma el modelo de la base de datos como parámetro (viewmodel.name = databasemodel.name). Este método parece forzado aunque funciona.
NOTA: Estoy publicando aquí porque creo que esto es más digno de discusión. Podría aprovechar un patrón de diseño diferente para superar este problema o podría ser tan simple como usar un atributo diferente en mi modelo. En mi búsqueda no he visto un buen método para superar este problema.
Mi objetivo final sería tener una buena aplicación MVC que aproveche en gran medida JSON para comunicarse con el servidor y mostrar datos. Mientras mantengo un modelo consistente en todas las capas (o lo mejor que se me ocurre).