使用实体框架在本地上下文上未完全撤消

本文关键字:撤消 上下文 实体 框架 | 更新日期: 2023-09-27 18:30:34

我在WinForm上使用EF6.0。我有一些表单允许在我的 Sql 紧凑型数据库中添加、修改或删除实体。正如我在这里读到的:使用本地和ToBindingList进行Windows窗体数据绑定,我使用DbContext的Local属性来执行DataBinding,这很方便,因为它是一个ObservableCollection(BindingSource -> BindinSourceNavigator -> DataGridView):

this.categoryBindingSource.DataSource = Context.Categories.Local.ToBindingList();

一切都运行良好,直到我不得不在这些表单上实现撤消功能(用户必须能够回滚自上次保存以来的每个更改)。这次我使用了这篇文章:撤消 DbContext 的更改:

    protected virtual void Undo()
    { 
        foreach (DbEntityEntry entry in _context.ChangeTracker.Entries())
        {
            switch (entry.State)
            {
                case EntityState.Modified:
                    entry.State = EntityState.Unchanged;
                    break;
                case EntityState.Added:
                    entry.State = EntityState.Detached;
                    break;                    
                case EntityState.Deleted:
                    entry.Reload();
                    break;
                default: break;
            }
        } 
    }
执行撤消时,所有修改的实体都会正确恢复,

所有添加的实体都会被删除,但删除的实体不会在我的网格中恢复......

经过几次搜索,我注意到它们仅在本地属性中丢失。"常规"实体似乎已正确回滚("状态已删除"为"未更改")。那么我的撤消功能中缺少某些内容吗?也许在这种特定情况下,我有义务手动将还原的实体添加到本地属性?

感谢您的帮助!

使用实体框架在本地上下文上未完全撤消

如果您将实体标记为已删除(EntityState.Deleted),我很惊讶文档会指出 Reload() 会撤消删除。相反,请尝试对"修改为删除"使用相同的代码。

        switch (entry.State)
        {
            case EntityState.Modified:
                entry.State = EntityState.Unchanged;
                break;
            case EntityState.Added:
                entry.State = EntityState.Detached;
                break;                    
            case EntityState.Deleted:
                entry.State = EntityState.Unchanged;
                break;
            default: break;
        }