Home > Software engineering >  Getting error when adding new object with HTTP POST in .NETCore
Getting error when adding new object with HTTP POST in .NETCore

Time:12-21

I am new to .NetCore and Blazor. I am trying to do a POST of an new Anime, but I am allways getteing the error "The Genre field is required." I have added the genreId to the JSON Object but still the same error -> Screenshot of the error

It's one to many relation, where one animal can have only one genre but one genre can have many enemies.

I don't know if it's useful but here are screenshots of my two tables in the DB -> Anime table and the Genre tab

Here are my to Models:

Anime model

    public class Anime
{
    public int Id { get; set; }
    public string Title { get; set; } = string.Empty;
    public string Description { get; set; } = string.Empty;
    public string CoverImage { get; set; } = string.Empty;
    public string Author { get; set; } = string.Empty;
    public Genre Genre { get; set; }
    public string Studio { get; set; } = string.Empty;
    public DateTime? ReleaseDate { get; set; }
    public DateTime? EndDate { get; set; }
}

Genre model

    public class Genre
{
    public int Id { get; set; }
    public string Title { get; set; } = string.Empty;
    [JsonIgnore]
    public List<Anime> Animes { get; set; }
}

AnimeService where I am adding the new anime to the DB

        public async Task<ServiceResponse<List<Anime>>> AddAnime(Anime NewAnime)
    {
        ServiceResponse<List<Anime>> serviceResponse = new ServiceResponse<List<Anime>>();

        _dataContext.Animes.Add(NewAnime);
        await _dataContext.SaveChangesAsync();

        var animes = await _dataContext.Animes
            .Include(a => a.Genre)
            .ToListAsync();

        if (animes == null)
        {
            serviceResponse.Success = false;
            serviceResponse.Message = "Animes could be found!";
        }

        serviceResponse.Data = animes;

        return serviceResponse;
    }

AnimeController

    [HttpPost]
    [Route("AddAnime")]
    public async Task<ActionResult<ServiceResponse<List<Anime>>>> AddAnime(Anime NewAnime)
    {
        return Ok(await _animeService.AddAnime(NewAnime));
    }

CodePudding user response:

It seems that your Anime instance don't habe a Genre object but it is requiered in your db context

You have to add navigation property GenreId as nullable if you think that Genre is optional

   public class Anime
{
    public int Id { get; set; }
    ... another properties
    
   public int? GenreId { get; set; }
    public  virtual Genre Genre { get; set; }

}

after this you will have to make a new database migration

CodePudding user response:

As an Anime can exist before it has Genre assigned I would configure the tables like this:

public class Anime
{
    public int Id { get; set; }
    public string Title { get; set; } = string.Empty;
    public string Description { get; set; } = string.Empty;
    public string CoverImage { get; set; } = string.Empty;
    public string Author { get; set; } = string.Empty;
    public int? GenreId { get; set; }

    [ForeignKey(nameof(GenreId))]
    public Genre? Genre { get; set; }

    public string Studio { get; set; } = string.Empty;
    public DateTime? ReleaseDate { get; set; }
    public DateTime? EndDate { get; set; }
}

public class Genre
{
    public int Id { get; set; }
    public string Title { get; set; } = string.Empty;

    [JsonIgnore]
    [InverseProperty(nameof(Anime.Genre))]
    public List<Anime> Animes { get; set; }
}
  • Related