AnonyXplorer
AnonyXplorer

Reputation: 55

ASP.NET Core adding collection to User - Object reference not set to an instance of an object

I'm trying to add a hero to my User.

User model:

public class AppUser : IdentityUser
{
    public ICollection<Hero> Heroes { get; set; }
}

Hero model:

public class Hero
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Ability { get; set; }

    [Required]
    public string SuitColors { get; set; }
    public double CurrentPower { get; set; }
    public double StartingPower { get; set; }
    public DateTime Created { get; set; } = DateTime.Now;
    public ICollection<PowerUp> PowerUps { get; set; }
    public AppUser AppUser { get; set; }

    [Required]
    public string AppUserId { get; set; }
}

The datacontext:

public class DataContext : IdentityDbContext<AppUser>
{
    public DataContext(DbContextOptions options) : base(options)
    {

    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<Hero>().HasMany(hero => hero.PowerUps).WithOne(powerUp => powerUp.Hero)
            .OnDelete(DeleteBehavior.Cascade);

        builder.Entity<AppUser>().HasMany(user => user.Heroes).WithOne(hero => hero.AppUser)
            .OnDelete(DeleteBehavior.Cascade);

    }
}

The issue starts when I'm trying to add a hero to a user:

    [HttpPost("{create}")]
    public async Task<ActionResult> CreateHero(RegisterHeroDto registerHeroDto)
    {
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        var user = await _userRepository.GetUserByIdAsync(userId);

        if (user == null)
        {
            return NotFound();
        }

        var hero = this.BuildHero(registerHeroDto);

        user.Heroes.Add(hero); // here is the error

        return Ok();
    }

    private Hero BuildHero(RegisterHeroDto registerHeroDto)
    {
        var startingPower = registerHeroDto.Ability == "attacker" ? 10 : 5;

        var hero = new Hero
        {
            Name = registerHeroDto.Name,
            Ability = registerHeroDto.Ability,
            SuitColors = registerHeroDto.SuitColors,
            StartingPower = startingPower,
            CurrentPower = startingPower,
            AppUserId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value
        };


        return hero;
    }

The error:

Object reference not set to an instance of an object.
  System.NullReferenceException: Object reference not set to an instance of an object.

Does anyone know why this type of error happens? I'm not sure what causes it and because of that, I don't have a clue on how to fix it. Can anyone please explain to me what causes the error and how should I fix it? Thanks!

Upvotes: 1

Views: 83

Answers (1)

Asif Rahman
Asif Rahman

Reputation: 263

always initialize Icollection or List while created so we don't need to forget about initializing it later on.

public class AppUser : IdentityUser
{
    public AppUser () {
        Heroes = new List<Hero>();
    }
    public ICollection<Hero> Heroes { get; set; }
}

public class Hero
{

    public Hero () {
        PowerUps = new List<PowerUp>();
    }
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Ability { get; set; }

    [Required]
    public string SuitColors { get; set; }
    public double CurrentPower { get; set; }
    public double StartingPower { get; set; }
    public DateTime Created { get; set; } = DateTime.Now;
    public ICollection<PowerUp> PowerUps { get; set; }
    public AppUser AppUser { get; set; }

    [Required]
    public string AppUserId { get; set; }
}

Upvotes: 2

Related Questions