使用实体框架在本地上下文上未完全撤消
本文关键字:撤消 上下文 实体 框架 | 更新日期: 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;
}