Reputation: 55
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
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