Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Dado que EF Core corrige automáticamente las propiedades de navegación, puede terminar con ciclos en el gráfico de objetos. Por ejemplo, cargar un blog y sus entradas relacionadas darán lugar a un objeto de blog que haga referencia a una colección de entradas. Cada una de esas entradas tendrá una referencia al blog.
Algunos marcos de serialización no permiten estos ciclos. Por ejemplo, Json.NET producirá la siguiente excepción si se encuentra un ciclo.
Newtonsoft.Json.JsonSerializationException: bucle de referencia automática detectado para la propiedad "Blog" con el tipo "MyApplication.Models.Blog".
System.Text.Json producirá una excepción similar si se encuentra un ciclo.
System.Text.Json.JsonException: se detectó un posible ciclo de objetos. Esto puede deberse a un ciclo o si la profundidad del objeto es mayor que la profundidad máxima permitida de 32. Considere la posibilidad de usar ReferenceHandler.Preserve en JsonSerializerOptions para admitir ciclos.
Si usa Json.NET en ASP.NET Core, puede configurar Json.NET para omitir los ciclos que encuentra en el gráfico de objetos. Esta configuración se realiza en el método ConfigureServices(...) de Startup.cs.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
...
}
Si usa System.Text.Json, puede configurarlo de esta manera.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
...
}
Otra alternativa es omitir las propiedades de navegación que provocan el ciclo para la serialización JSON. Si usa Json.NET, puede decorar una de las propiedades de navegación con el atributo [JsonIgnore], lo cual instruye a Json.NET que no recorra esa propiedad de navegación durante la serialización. Para System.Text.Json, puede usar el [JsonIgnore] atributo en el System.Text.Json.Serialization espacio de nombres para lograr el mismo efecto.