Entity Framework 数据库更改在 DbContext 中看不到

3

我有一个简单的应用程序,连接着一个数据库(Entity Framework, code first)。我有一个屏幕用于更新数据库中的一条记录。以下代码可以更新数据库:

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没有使用新数据进行更新。即使我从数据库重新加载玩家的整个集合,也不会更新任何内容,直到我完全重新启动应用程序。

很可能你在两个调用之间保持了上下文的开放状态。尝试使用using语句或更好的是使用IoC容器。https://dev59.com/64fca4cB1Zd3GeqPdxDK - Steve Greene
你要如何“查看_context.Players”? - Evk
你能试一下 .Find() 吗? - hasan
EF 会保留已检索值的快照。然而,对 _context.Players 进行枚举应该会导致另一个数据库调用以检索更新后的值,我不太清楚您是如何检索这些值的,除非查看存储对象的内部 dbcontext 属性。 - DevilSuichiro
1
我已经尝试了using语句,以及更改入口状态,但仍然没有运气。 - Connor Szczepaniak
康纳,你最终解决了这个问题吗? - user204588
2个回答

4

实体本身具有缓存实体的机制,以提高在执行两次或多次选择等操作时的速度。您可以通过设置来更改实体的状态。

entity.State = EntityState.Modified;

请考虑使用工作单元的概念,而不是在类内共享相同的dbContext。这将通过使用以下语法来处理上下文本身:
using(DbContext dbContext = new DbContext())
{
    //Do some stuff, update, delete etc
}

如果您没有正确处理上下文,那么您最终会给应用程序带来其他问题。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接