prosource

ASP.NET Core API가 목록의 첫 번째 결과만 반환합니다.

probook 2023. 2. 22. 22:18
반응형

ASP.NET Core API가 목록의 첫 번째 결과만 반환합니다.

팀 웹 API 컨트롤러를 만들고 GET 메서드를 호출하여 데이터베이스에 있는 모든 팀의 json 결과를 얻으려고 합니다.하지만 전화를 걸면 첫 번째 팀만 json으로 돌아오지만 리턴 스테이트먼트에 브레이크 포인트를 설정하면 254개 팀 모두와 모든 게임을 할 수 있습니다.

다음 두 가지 모델을 다루고 있습니다.

public class Team
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Icon { get; set; }
    public string Mascot { get; set; }
    public string Conference { get; set; }
    public int NationalRank { get; set; }

    public List<Game> Games { get; set; }
}

public class Game
{
    public string Id { get; set; }
    public string Opponent { get; set; }
    public string OpponentLogo { get; set; }
    public string GameDate { get; set; }
    public string GameTime { get; set; }
    public string TvNetwork { get; set; }
    public string TeamId { get; set; }

    public Team Team { get; set; }
}

이렇게 하면:

[HttpGet]
public async Task<List<Team>> Get()
{
    var teams = await _context.Teams.ToListAsync();

    return teams;
}

254개 팀 모두 획득했지만 EF Core는 느린 로드를 지원하지 않기 때문에 게임 속성은 무효입니다.그래서 제가 정말 하고 싶은 것은 을 추가하는 것입니다.다음과 같이 include()를 입력합니다.

[HttpGet]
public async Task<List<Team>> Get()
{
    var teams = await _context.Teams.Include(t => t.Games).ToListAsync();

    return teams;
}

이렇게 하면 첫 번째 게임을 가진 첫 번째 팀이 반환되지만 다른 게임은 반환되지 않습니다.다음은 json입니다.

[
  {
    "id": "007b4f09-d4da-4040-be3a-8e45fc0a572b",
    "name": "New Mexico",
    "icon": "lobos.jpg",
    "mascot": "New Mexico Lobos",
    "conference": "MW - Mountain",
    "nationalRank": null,
    "games": [
      {
        "id": "1198e6b1-e8ab-48ab-a63f-e86421126361",
        "opponent": "vs Air Force*",
        "opponentLogo": "falcons.jpg",
        "gameDate": "Sat, Oct 15",
        "gameTime": "TBD ",
        "tvNetwork": null,
        "teamId": "007b4f09-d4da-4040-be3a-8e45fc0a572b"
      }
    ]
  }
]

리턴 스테이트먼트에 브레이크 포인트를 설정하면 254개 팀이 있으며 모든 팀이 올바르게 게임을 채우고 있음을 나타냅니다.그러나 json 결과는 반영되지 않습니다.다음은 이미지입니다.

여기에 이미지 설명 입력

이 작업을 동기 및 비동기 모두 시도했지만 동일한 결과를 얻었습니다.왜 json에서 하나의 결과만 반환되는데 중단점에서는 모든 결과가 반환되는지 아십니까?

이 항목을 에 추가합니다.Startup.cs내부public void ConfigureServices(IServiceCollection services)방법:

services.AddMvc().AddJsonOptions(options => {
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        });

이 문제는 https://github.com/aspnet/Mvc/issues/4160에서 논의되었으며 https://github.com/aspnet/EntityFramework/issues/4646도 순환 참조를 참조하십시오.

인라인과 같이 json 출력을 제어하는 경우 주의할 필요가 있습니다.JsonSerializerSettings선택,

[HttpGet]
public async Task<IActionResult> Get([FromForm]bool strip_nulls = true)
{
    var teams = await _context.Teams.Include(t => t.Games).ToListAsync();

    return Json(teams, new JsonSerializerSettings() { 
         NullValueHandling = strip_nulls ? NullValueHandling.Ignore : NullValueHandling.Include
    });
}

@adeam-caglin에서 제안하는 솔루션, 즉 접근법이 틀리지 않은 솔루션을 넣는 것만으로는 효과가 없습니다.반환 시 설정도 해야 합니다.예를들면.

[HttpGet]
public async Task<IActionResult> Get([FromForm]bool strip_nulls = true)
{
    var teams = await _context.Teams.Include(t => t.Games).ToListAsync();

    return Json(teams, new JsonSerializerSettings() { 
         NullValueHandling = strip_nulls ? NullValueHandling.Ignore : NullValueHandling.Include,
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    });
}

기본적으로는 null out되며, 에서 설정한 설정에 추가되지 않습니다.Startup.cs또한 출력을 전체적으로 변경하지 않고 경우에 따라 변경하기 위한 로드맵도 제공합니다.

편집

또한 잠시 시간을 내어 사용 시 어떤 일이 일어나는지 명확히 하고 싶습니다.ReferenceLoopHandling.Ignore소방 호스로 물을 마시라고 하지만 흐름이 통제되기를 바랍니다.고도로 개발된 모델링을 사용하는 경우 원하는 엔티티와 하위 목록을 가져올 것으로 생각되는 세트가 있을 가능성이 높지만, 이러한 목록 항목에도 하위 항목이나 다른 부모가 있으면 해당 항목을 로드합니다.예를 들어,

Teams>Players>Contacts
Games>Teams

조손난 아파트가 필요했을 거야Game>Teams 결국엔 '''가 된다'''가 된다'''Games>Teams>Players이것은 간단한 예이지만, 몇 KB의 데이터에서 결과를 소비하는 클라이언트를 호출하는 네버 엔딩 루프가 되는 방법을 쉽게 알 수 있습니다.

이것은 당신이 자신의 흐름을 통제할 필요가 있다는 것을 의미합니다.하려면 , 「json」을 짜넣을 ..AsNoTracking() .Include(x => x.Games)

매우 간단한 예로 다음과 같은 작업을 수행해야 합니다.

[HttpGet]
public async Task<IActionResult> Get([FromForm]bool strip_nulls = true)
{
    var teams = _context.Teams.AsQueryable();
    teams = teams.Include(t => t.Games).AsNoTracking();
    Teams _return = await teams.ToListAsync();
    return Json(_return, new JsonSerializerSettings() { 
         NullValueHandling = strip_nulls ? NullValueHandling.Ignore : NullValueHandling.Include,
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore
    });
}

언급URL : https://stackoverflow.com/questions/39024354/asp-net-core-api-only-returning-first-result-of-list

반응형