我是实体框架核心的新手。我正在尝试将数据保存在球队和球员表中,但是我得到了
对象引用未设置为对象的实例
错误。这是下面的示例代码:
玩家类
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
答案 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肯定有一种更有效的方法,但这至少可以解决这个问题,您应该初始化列表