내 프로젝트는 레시피 (요리) .NET Core 5.0이있는 애플리케이션입니다.
그리고 새 레시피 (HttpPost) 웹 API를 추가하는 데 문제가 있습니다.
우편 배달부에서 내 응답은 다음과 같습니다.
"가능한 개체주기가 감지되었습니다. 이는주기 때문이거나 개체 깊이가 최대 허용 깊이 인 32보다 큰 경우 일 수 있습니다.주기를 지원하려면 JsonSerializerOptions에서 ReferenceHandler.Preserve를 사용하는 것이 좋습니다."
새 레시피를 만들 때 모든 속성 (순환 참조)을 포함하는 Recipe 대신 recipeToCreateDto를 사용해야합니다.
제대로 작동하도록 도와주세요. 매핑 방법 등
https://i.postimg.cc/Mphv7zRH/screen.png <-여기 화면
클래스 및 리포지토리 패턴 매핑에 AutoMapper를 사용하고 있습니다.
public class AppUser
{
public int Id { get; set; }
public string UserName { get; set; }
public ICollection<Recipe> Recipes {get; set;}
}
}
사용자는 많은 레시피를 가지고 있습니다.
public class Recipe
{
public int Id { get; set; }
public string Name { get; set; }
public AppUser AppUser { get; set; }
public int AppUserId { get; set; }
}
데이터 전송 개체
public class RecipeForCreateDto
{
[Required]
[StringLength(50, MinimumLength = 3, ErrorMessage = "You must specify name between 3 and 50 characters")]
public string Name { get; set; }
public int AppUserId { get; set; }
public int AuthorId { get; set; }
}
내 AutoMapperProfiles.cs에서
public class AutoMapperProfiles : Profile
{
public AutoMapperProfiles()
{
CreateMap<RecipeForCreateDto, Recipe>();
}
레시피 인터페이스
public interface IRecipeRepository
{
Task<Recipe> AddNewRecipe(Recipe recipe);
}
public class RecipeRepository : IRecipeRepository
{
private readonly DataContext _context;
private readonly IMapper _autoMapper;
public RecipeRepository(DataContext context, IMapper autoMapper)
{
_autoMapper = autoMapper;
_context = context;
}
public async Task<Recipe> AddNewRecipe(Recipe recipe)
{
await _context.Recipes.AddAsync(recipe);
await _context.SaveChangesAsync();
return recipe;
}
}
사용자 컨트롤러 :
User.GetUsername ()은 사용자의 사용자 이름을 가져 오는 정적 메서드입니다.
[HttpPost("add-recipe")]
public async Task<ActionResult> AddNewRecipe(RecipeForCreateDto recipeForCreateDto)
{
var userFromRepo = await _userRepository.GetUserByUsernameAsync(User.GetUsername());
recipeForCreateDto.Name = recipeForCreateDto.Name.ToLower();
if (await _recipeRepository.RecipeExists(recipeForCreateDto.Name))
return BadRequest("Recipe with that name already exists!");
var recipeToCreate = _autoMapper.Map<Recipe>(recipeForCreateDto);
recipeToCreate.AppUserId = userFromRepo.Id;
var createdRecipe = await _recipeRepository.AddNewRecipe(recipeToCreate); // here is problem
var recipeToReturn = _autoMapper.Map<RecipeForDetailDto>(createdRecipe);
return CreatedAtRoute("GetRecipe", new { controller = "Recipes", id = createdRecipe.Id }, recipeToReturn);
}
"가능한 개체주기가 감지되었습니다. 이는주기 때문이거나 개체 깊이가 최대 허용 깊이 인 32보다 큰 경우 일 수 있습니다.주기를 지원하려면 JsonSerializerOptions에서 ReferenceHandler.Preserve를 사용하는 것이 좋습니다."
이 문제의 경우 startup.cs ConfigureServices
메서드에 다음 코드를 추가 할 수 있습니다 .
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다