繁体   English   中英

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

[英]entity framework core api save one to many relationship data

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

Object 引用未设置为 object 的实例

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

播放器 Class

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

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

团队 class

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

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

数据库上下文

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

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

Controller 后置方法

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

}

每当我执行此代码时,我都会收到“未设置对象实例的对象引用”有什么想法吗? 谢谢错误图片

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

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

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

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

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

这样你就可以像这样创建一个新实例

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

在您的Team object 中,您永远不会初始化 Players 集合。 因此,调用Add()方法时, team.Players为 null。

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

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

您的Players属性是null

您可以在添加之前创建它

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

但我想您想从某个地方添加新团队,因此您应该像对待团队一样向您发送 http 请求中的Players ,例如

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

您的玩家不存在于数据库中,并且在您将它们添加到您的 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();

我确定有一种更有效的方法,但这至少也是一种解决方法,是的,您应该初始化您的列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM