我有一个新的ASP.NET MVC 4应用程序,我开始玩了。我过去使用过Entity-Framework,但这是我第一次使用Code First。我遇到的麻烦是,当添加新的PLAYER
时,POSITIONS
中的新记录也会被添加,即使该表中已经存在匹配的记录。
Player player = new Player();
player.PlayerName = "Bob";
PositionRepository posRepo = new PositionRepository();
player.PlayerPosition = posRepo.Get(1);
PlayerRepository playerRepo = new PlayerRepository();
playerRepo.Add(player);
public Player Add(Player player)
{
_db.Players.Add(player);
_db.SaveChanges();
return player;
}
public Position Get(int id)
{
return _db.Positions.SingleOrDefault(r => r.Id == id);
}
我可以包含Player和Position类的代码,如果这样有用的话。
总结:当我添加新的PLAYER
记录时,我希望它引用现有的POSITION
记录。在上面的例子中,我只抓住第一个POSITION
记录。而是为玩家创建一个新的POSITION
记录。
有趣的是,如果我在循环中构建多个玩家,则只会创建一个新的POSITION
记录。这仍然是一个问题,因为我不想创建任何新的POSITION
记录,而是使用数据库中已有的记录。
答案 0 :(得分:1)
重新创建位置记录,因为您在PlayerRepository
和PositionRepository
上使用了不同的DbContext实例,因此位置记录丢失了其当前状态。
使用存储库模式和ORM时,这是一个常见问题。尚未尝试,但我认为它会起作用
public Player Add(Player player)
{
//add this
_db.Entry(player.PlayerPosition).State = EntityState.Modified;
_db.Players.Add(player);
_db.SaveChanges();
return player;
}