实体框架数据库更改未在DbContext中看到

时间:2017-06-09 21:29:55

标签: c# entity-framework

我有一个连接到数据库的简单应用程序(实体框架,代码优先)。我有一个用于更新数据库条目的屏幕。我可以使用以下代码更新数据库:

public void UpdatePlayer()
{
    Player playerInDb = GetPlayerFromDb(_player.Id);

    playerInDb.Name = Name;
    playerInDb.Score = Score;

    _context.SaveChanges();
    TryClose();
}

private Player GetPlayerFromDb(int id)
{
    return _context.Players.Single(p => p.Id == id);
}

如果我在调用SaveChanges后立即刷新数据库,我可以看到实际数据库中的更改,但如果我查看_context.Players,旧的值仍然存在。只有在我关闭我的应用程序并重新打开它之后,更改才会出现在DbContext中。在调用SaveChanges后,如何确保数据库中的更新数据显示在我的DbContext上?

更新

我已将代码更改为以下内容:

    public void UpdatePlayer()
    {
        Player playerInDb = GetPlayerFromDb(_player.Id);

        playerInDb.Name = Name;
        playerInDb.Score = Score;

        using (var context = new ApplicationDbContext())
        {
            context.Players.Attach(playerInDb);
            context.Entry(playerInDb).State = EntityState.Modified;
            context.SaveChanges();
        }
        TryClose();
    }

我仍有同样的问题。记录在数据库中更新,但在应用程序中没有更新,因此我的UI不会使用新数据进行更新。即使我从数据库重新加载整个播放器集合,在完全重新启动应用程序之前,任何内容都不会更新。

2 个答案:

答案 0 :(得分:0)

您需要额外的步骤来修改对象:

_context.Players.Attach(playerInDb);

var entry = _context.Entry(playerInDb);
entry.State = EntityState.Modified;

_context.SaveChanges();   

此外,您可能需要查看这些以获取更多详细信息:
- https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx
- Entity Framework 5 Updating a Record
- How to update record using Entity Framework 6?

答案 1 :(得分:0)

实体本身有一种机制来缓存实体,以增加选择等两次或多次执行时的速度时间。您可以通过设置来更改实体的状态。

entity.State = EntityState.Modified;

请考虑使用工作单元概念,而不是在课堂上共享相同的dbContext。这将使用以下语法来处置上下文:

using(DbContext dbContext = new DbContext())
{
    //Do some stuff, update, delete etc
}

如果你没有正确处理上下文,你最终也会导致其他问题。