[英]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.