Se detectó una referencia circular al serializar un objeto de tipo 'SubSonic.Schema .DatabaseColumn'.

Se detectó una referencia circular al serializar un objeto de tipo 'SubSonic.Schema .DatabaseColumn'.

Parece que hay referencias circulares en su jerarquía de objetos que no son compatibles con el serializador JSON. Necesitas todas las columnas? Puede seleccionar solo las propiedades que necesita en la vista:

return Json(new 
{  
    PropertyINeed1 = data.PropertyINeed1,
    PropertyINeed2 = data.PropertyINeed2
});

Esto hará que su objeto JSON sea más ligero y fácil de entender. Si tiene muchas propiedades, AutoMapper podría usarse para mapear automáticamente entre objetos DTO y objetos View.


Tuve el mismo problema y lo resolvió using Newtonsoft.Json;

var list = JsonConvert.SerializeObject(model,
    Formatting.None,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
});

return Content(list, "application/json");

En realidad, esto sucede porque los objetos complejos son los que hacen que el objeto json resultante falle. Y falla porque cuando se asigna el objeto, asigna los elementos secundarios, lo que asigna a sus padres, haciendo que ocurra una referencia circular. Json tardaría un tiempo infinito en serializarlo, por lo que evita el problema con la excepción.

El mapeo de Entity Framework también produce el mismo comportamiento y la solución es descartar todas las propiedades no deseadas.

Solo explicitando la respuesta final, el código completo sería:

public JsonResult getJson()
{
    DataContext db = new DataContext ();

    return this.Json(
           new {
                Result = (from obj in db.Things select new {Id = obj.Id, Name = obj.Name})
               }
           , JsonRequestBehavior.AllowGet
           );
}

También podría ser el siguiente en caso de que no quieras los objetos dentro de un Result propiedad:

public JsonResult getJson()
{
    DataContext db = new DataContext ();

    return this.Json(
           (from obj in db.Things select new {Id = obj.Id, Name = obj.Name})
           , JsonRequestBehavior.AllowGet
           );
}