【问题标题】:entity framework core api save one to many relationship data实体框架核心api保存一对多关系数据
【发布时间】:2020-12-01 14:41:36
【问题描述】:

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

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

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

播放器类

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

数据库上下文

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

【问题讨论】:

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


    【解决方案1】:

    由于Players 集合为空而发生错误。你可以默认实例化如下:

    public class Team
    {
       public int TeamId {get;set;}
       public string TeamName {get;set;}
    
       public ICollection<Player> Players {get;set;} = new HashSet<Player>();
    }
    

    【讨论】:

      【解决方案2】:

      您的Players 属性是null

      您可以在添加之前创建它

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

      但我猜你想从某个地方添加新团队,所以你应该发送Players 在你的 http 请求中,就像你对团队所做的那样,例如

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-15
            相关资源
            最近更新 更多