Athenkosi
Athenkosi

Reputation: 36

entity framework core api save one to many relationship data

I'm new to entity framework core. I'm trying to save data in a team and player tables, but I get a

Object reference not set to an instance of an object

error. Here is my sample code below:

Player Class

public class Player
{
  public int PlayerID {get;set;}
  public string PlayerName {get;set;}

  public int TeamID {get;set;}
  public Team Team {get; set;}
}

Team class

public class Team
{
  public int TeamId {get;set;}
  public string TeamName {get;set;}

  public ICollection<Player> Players {get;set;}
}

DBContext

public class SoccerDbContext: DbContext
{
  public SoccerDbContext(DbContextOptions<SoccerDbContext> options):base(options)
  {}

  public DBSet<Team> Teams {get;set;}
  public DBSet<Player> Players {get;set;}
}

Controller post method

[HttpPost]
public async Task<ActionResult> Save(Team team)
{
  Player player1 = new Player{
    PlayerName = "Steven"
  };
  Player player2 = new Player{
    PlayerName = "Frank"
  };

  team.Players.Add(player1); //This I where the error occurs
  team.Players.Add(player2);
  
  _context.Team.Add(team);
  await _context.SaveChangesAsync();

  return RedirectToAction("index");

}

Whenever I execute this code I receive "Object reference not set to an instance of an object" any idea? Thank you Error image

Upvotes: 0

Views: 1624

Answers (4)

Tai
Tai

Reputation: 21

Your players don't exist in the database and wont have an id until you save them before you add to your team.players list. Perhaps try

_context.Players.add(player1);
_context.Players.add(player2);
_context.SaveChanges();

 team.Players.Add(player1); //This I where the error occurs
  team.Players.Add(player2);
  
  _context.Team.Add(team);
  await _context.SaveChangesAsync();

tbh im sure theres a more efficient way but this is a way around at least also yes you should initialise your list

Upvotes: 0

AnGG
AnGG

Reputation: 831

Your Players property is null,

You can create it before you add

  team.Players = new List<Player>();
  team.Players.Add(player1);
  team.Players.Add(player2);

but i guess you want to add new team from somewhere so you should send the Players inside you http request as you do with the team, for example

{
    "teamName": "MyTeam",
    "players": [
        {
            "playerName": "Steven"
        },
        {
            "playerName": "Frank"
        }
    ]
}

Upvotes: 1

SBFrancies
SBFrancies

Reputation: 4240

The error is occuring as the Players collection is null. You can instantiate by default as follows:

public class Team
{
   public int TeamId {get;set;}
   public string TeamName {get;set;}

   public ICollection<Player> Players {get;set;} = new HashSet<Player>();
}

Upvotes: 1

robnasby
robnasby

Reputation: 966

In your Team object, you never initialize the Players collection. Therefore, team.Players is null when you call the Add() method.

You can initialize the property like so:

public ICollection<Player> Players {get;} = new List<Player>();

Upvotes: 0

Related Questions