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

Posted

技术标签:

【中文标题】在 DbContext 中看不到实体框架数据库更改【英文标题】:Entity Framework database changes not seen in the DbContext 【发布时间】:2017-11-12 00:18:14 【问题描述】:

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

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 容器。 ***.com/questions/28042161/ef-returns-old-values 你究竟是如何“看 _context.Players”的? 你可以试试.Find() EF 保留检索到的值的快照。但是,_context.Players 的枚举应该导致另一个 db 调用来检索更新的值,除了查看存储对象的内部 dbcontext 属性之外,我真的不知道如何检索值。 我尝试了using 语句,以及更改了入口状态,但仍然没有成功。 【参考方案1】:

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

entity.State = EntityState.Modified;

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

using(DbContext dbContext = new DbContext())

    //Do some stuff, update, delete etc

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

【讨论】:

【参考方案2】:

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

_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?

【讨论】:

以上是关于在 DbContext 中看不到实体框架数据库更改的主要内容,如果未能解决你的问题,请参考以下文章

实体框架:如何防止 dbcontext 被多个线程访问?

实体框架 6:审计/跟踪更改

为啥在使用实体框架时要重新启动 DbContext?

如何刷新实体框架核心 DBContext?

C# 实体框架 DBContext

实体框架 DBContext 数据绑定问题