Bucle de autorreferencia de Newtonsoft JsonSerializer usando Entity Framework Core
He encontrado el error:
JsonSerializationException: bucle de referencia automática detectado para la propiedad 'Asunto' con el tipo 'Project.Models.Subject'. Ruta 'datos [0] .Totales'.
Se produce cuando cargo una vista con una cuadrícula de datos poblada por unIEnumerable<Subject>
modelo. The Grid es un DevExtreme DataGrid vinculado al modelo de la Vista de esta manera:
@(Html.DevExtreme().DataGrid()
.DataSource(Model)
.Paging(paging =>
{
paging.Enabled(true);
paging.PageIndex(0);
paging.PageSize(20);
})
.Columns(columns =>
{
columns.Add().DataField("SubjectId");
... other fields
})
)
El cual se completa desde un controlador que extrae datos de un repositorio con esta función:
public async Task<IEnumerable<Subject>> GetSubjectsAsync()
{
return await _context.Subject.ToListAsync();
}
La tabla Asunto tiene una relación 1: 1 con Totales con Totales que tienen una referencia de clave externa al Asunto. Los modelos en el proyecto tienen este aspecto (generado a partir de Scaffold-DbContext):
public partial class Subject
{
public Guid SubjectId { get; set; }
public virtual Totals Totals { get; set; }
}
public partial class Totals
{
public Guid TotalsId { get; set; }
public virtual Subject Subject { get; set; }
}
Como los 2 objetos se refieren entre sí, provoca un bucle cuando se serializa. Para corregir esto, agregué esta configuración a mi método Startup.ConfigureServices:
services.AddMvc()
.AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
Lo que obtuve de esta respuesta:https://stackoverflow.com/a/40501464/7897176
Sin embargo, esto no soluciona el problema y sigue causando un error al cargar una vista que involucra sujetos. Agregando[JsonIgnore]
La propiedad Asunto de Totales soluciona el problema, pero no quiero tener que agregar eso a cada propiedad secundaria en mis modelos y tener que rehacerlo cada vez que actualizo mis modelos desde la base de datos.