관련 데이터 및 직렬화

EF Core가 탐색 속성을 자동으로 수정하기 때문에 개체 그래프에 순환 참조가 발생할 수 있습니다. 예를 들어 블로그 및 관련 게시물을 로드하면 게시물 컬렉션을 참조하는 블로그 개체가 생성됩니다. 이러한 각 게시물에는 블로그에 대한 참조가 있습니다.

일부 serialization 프레임워크는 이러한 주기를 허용하지 않습니다. 예를 들어, Json.NET은 주기가 발견될 경우 다음과 같은 예외를 발생시킵니다.

Newtonsoft.Json.JsonSerializationException: 'MyApplication.Models.Blog' 형식의 속성 'Blog'에 대해 자체 참조 루프가 검색되었습니다.

주기가 발견되면 System.Text.Json은 유사한 예외를 throw합니다.

System.Text.Json.JsonException: 가능한 개체 주기가 검색되었습니다. 이는 순환이나 개체 깊이가 허용된 최대 깊이인 32를 초과하는 경우일 수 있습니다. JsonSerializerOptions에서 ReferenceHandler.Preserve를 사용하여 주기를 지원하는 것이 좋습니다.

ASP.NET Core에서 Json.NET 사용하는 경우 개체 그래프에서 찾은 주기를 무시하도록 Json.NET 구성할 수 있습니다. 이 구성은 .의 ConfigureServices(...) 메서드에서 수행됩니다 Startup.cs.

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}

System.Text.Json을 사용하는 경우 다음과 같이 구성할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}

또 다른 대안은 JSON serialization에 대한 주기를 발생시키는 탐색 속성을 무시하는 것입니다. Json.NET을 사용하는 경우, [JsonIgnore] 특성으로 탐색 속성 중 하나를 데코레이트할 수 있습니다. 이 특성을 사용하면 Json.NET이 직렬화하는 동안 해당 탐색 속성을 순회하지 않도록 지시할 수 있습니다. System.Text.Json의 경우 System.Text.Json.Serialization 네임스페이스의 [JsonIgnore] 특성을 사용하여 동일한 효과를 얻을 수 있습니다.