[c#] 지원되지 않는 .Net Core 3.0 가능한 개체주기가 감지되었습니다.

일대 다로 관련된 2 개의 엔티티가 있습니다.

public class Restaurant {
   public int RestaurantId {get;set;}
   public string Name {get;set;}
   public List<Reservation> Reservations {get;set;}
   ...
}
public class Reservation{
   public int ReservationId {get;set;}
   public int RestaurantId {get;set;}
   public Restaurant Restaurant {get;set;}
}

내 API를 사용하여 예약 된 레스토랑을 얻으려고하면

   var restaurants =  await _dbContext.Restaurants
                .AsNoTracking()
                .AsQueryable()
                .Include(m => m.Reservations).ToListAsync();
    .....

객체에 서로 참조가 포함되어 있기 때문에 응답으로 오류가 발생합니다. 별도의 모델을 작성
하거나 NewtonsoftJson 구성을 추가 하도록 권장 하는 관련 게시물이 있습니다.

문제는 별도의 모델을 만들고 싶지 않으며 두 번째 제안이 도움이되지 않는다는 것입니다. 주기적인 관계없이 데이터를로드하는 방법이 있습니까? *

System.Text.Json.JsonException : 지원되지 않는 가능한 오브젝트주기가 발견되었습니다. 주기 때문이거나 오브젝트 깊이가 최대 허용 깊이 인 32보다 큽니다. System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected (Int32 maxDepth)에서 System.Text.Json.JsonSerializer.Write (Utf8JsonWriter writer) System.Text.Json.JsonSerializer.WriteAsyncCore (Stream utf8Json, Object value, Type inputType, JsonSerializerOptions 옵션, CancellationToken CancellationToken)에서 System.Text.JsonSerializerOptions 옵션, WriteStack 및 state)의 Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions 옵션, WriteStack 및 상태). Microsoft.AspNetCore.Mvc에서 WriteResponseBodyAsync (OutputFormatterWriteContext 컨텍스트, Encoding selectedEncoding).

*



답변

새 프로젝트에서 코드를 시험해 보았고 두 번째 방법은 Microsoft.AspNetCore.Mvc.NewtonsoftJson 3.0을 처음 설치 한 후 잘 작동하는 것 같습니다

services.AddControllerWithViews()
    .AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);

새 프로젝트를 시도하고 차이점을 비교하십시오.


답변

.NET Core 3.1
Microsoft.AspNetCore.Mvc.NewtonsoftJson 패키지 설치

Startup.cs 서비스 추가

services.AddControllers().AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);


답변

시작시 JSON 직렬화 옵션을 설정하면 나중에 비슷한 경우가 발생할 수 있으므로 선호되는 방법 일 수 있습니다. 그러나 그 동안 모델에 데이터 속성을 추가하여 직렬화되지 않도록 할 수 있습니다. https://www.newtonsoft.com/json/help/html/PropertyJsonIgnore.htm

public class Reservation{
    public int ReservationId {get;set;}
    public int RestaurantId {get;set;}
    [JsonIgnore]
    public Restaurant Restaurant {get;set;}
}


답변

public class Reservation{
public int ReservationId {get;set;}
public int RestaurantId {get;set;}
[JsonIgnore]
public Restaurant Restaurant {get;set;} 

위도 작동했습니다. 그러나 나는 다음을 선호한다

services.AddControllers().AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);

먼저 모든 모델에 속성을 추가해야하므로 순환 참조가있을 수 있습니다.


답변