Udostępnij za pośrednictwem


Dane powiązane i serializacja

Ponieważ program EF Core automatycznie naprawia właściwości nawigacji, możesz zakończyć się cyklami na grafie obiektu. Na przykład załadowanie bloga i powiązanych wpisów spowoduje utworzenie obiektu blogu, który odwołuje się do kolekcji wpisów. Każdy z tych wpisów będzie miał odwołanie z powrotem do blogu.

Niektóre struktury serializacji nie zezwalają na takie cykle. Na przykład Json.NET zgłosi następujący wyjątek, jeśli zostanie znaleziony cykl.

Newtonsoft.Json.JsonSerializationException: Wykryto pętlę samodzielnego odwoływania się do właściwości "Blog" z typem "MyApplication.Models.Blog".

Plik System.Text.Json zgłosi podobny wyjątek w przypadku znalezienia cyklu.

System.Text.Json.JsonException: Wykryto możliwy cykl obiektów. Może to być spowodowane cyklem lub jeśli głębokość obiektu jest większa niż maksymalna dozwolona głębokość 32. Rozważ użycie metody ReferenceHandler.Preserve w JsonSerializerOptions w celu obsługi cykli.

Jeśli używasz Json.NET w programie ASP.NET Core, możesz skonfigurować Json.NET, aby ignorować cykle znalezione na grafie obiektów. Ta konfiguracja jest wykonywana w metodzie ConfigureServices(...) w Startup.cspliku .

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddMvc()
        .AddJsonOptions(
            options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        );

    ...
}

Jeśli używasz pliku System.Text.Json, możesz go skonfigurować w następujący sposób.

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
        });

    ...
}

Inną alternatywą jest zignorowanie właściwości nawigacji, które powodują cykl serializacji JSON. Jeśli używasz Json.NET, możesz ozdobić jedną z właściwości nawigacji za pomocą atrybutu [JsonIgnore] , który nakazuje Json.NET, aby nie przechodzić przez właściwość nawigacji podczas serializacji. W przypadku pliku System.Text.Json możesz użyć atrybutu [JsonIgnore] System.Text.Json.Serialization w przestrzeni nazw, aby osiągnąć ten sam efekt.