1

我有一个新的 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创建任何新记录,而是使用数据库中已经存在的记录。

4

1 回答 1

1

快速猜测。

由于您使用了不同的 DbContext 实例,因此重新创建了 Position 记录PlayerRepositoryPositionRepository因此 Position 记录丢失了其当前状态。

这是使用存储库模式和 ORM 时的常见问题。还没有尝试,但我认为它会工作

public Player Add(Player player)
{
    //add this
    _db.Entry(player.PlayerPosition).State = EntityState.Modified;

    _db.Players.Add(player);
    _db.SaveChanges();
    return player;
}
于 2012-12-13T05:25:27.173 回答