实体框架核心api保存一对多关系数据

时间:2020-08-11 21:19:07

标签: c# api asp.net-core entity-framework-core

我是实体框架核心的新手。我正在尝试将数据保存在球队和球员表中,但是我得到了

对象引用未设置为对象的实例

错误。这是下面的示例代码:

玩家类

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

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

团队班

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;}
}

控制器发布方法

[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");

}

每执行一次此代码,我都会收到“对象引用未设置为对象实例”的任何想法?谢谢 Error image

5 个答案:

答案 0 :(得分:1)

由于Players集合为空,因此发生错误。您可以默认实例化如下:

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

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

答案 1 :(得分:0)

您是否在类中设置了构造函数?

   public Player(string name)
   {
      PlayerName = name;
   }

这样,您可以创建一个像这样的新实例

  Player player1 = new Player("Steven")
  Player player2 = new Player("Frank")

答案 2 :(得分:0)

Team对象中,您永远不会初始化Players集合。因此,当您调用team.Players方法时,Add()为空。

您可以像这样初始化属性:

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

答案 3 :(得分:0)

您的Players属性是null

您可以在添加前创建它

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

但是我想您想从某个地方添加新团队,所以您应该发送Players 就像您与团队一样,在您的http请求中添加

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

答案 4 :(得分:0)

您的球员不存在于数据库中,并且在添加到team.players列表之前将其保存之前没有ID。 也许尝试

_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肯定有一种更有效的方法,但这至少可以解决这个问题,您应该初始化列表