实体未被重用

时间:2012-12-13 03:59:31

标签: asp.net-mvc entity-framework asp.net-mvc-4 ef-code-first entity-framework-5

我有一个新的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记录,而是使用数据库中已有的记录。

1 个答案:

答案 0 :(得分:1)

快速猜测。

重新创建位置记录,因为您在PlayerRepositoryPositionRepository上使用了不同的DbContext实例,因此位置记录丢失了其当前状态。

使用存储库模式和ORM时,这是一个常见问题。尚未尝试,但我认为它会起作用

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

    _db.Players.Add(player);
    _db.SaveChanges();
    return player;
}