撤销上一次数据库保存所做的更改。

6
当我按下一个按钮时,jQuery使用ajax删除一个项目,但是我是否可以创建另一个功能,可以“撤消”刚刚发生的删除? 我的删除控制器:
    [HttpPost]
    public void DeleteProject(int Id)
    {
        var Item = from a in db.Project
                   where a.ProjectId.Equals(Id)
                   select a;

        Project SelectedProject = Item.FirstOrDefault();
        ICollection<ProjectProfile> Profiles = SelectedProject.ProjectProfile;
        ICollection<Member> Members = SelectedProject.Member;

        db.Member.RemoveRange(Members);
        db.ProjectProfile.RemoveRange(Profiles);

        db.Project.Remove(SelectedProject);
        db.SaveChanges();

        RedirectToAction("Index", "Projects");
    }

1
除非您的删除功能在“删除”之后将“已删除”的项存储在其他地方,例如定期清空的临时表中。 - Works for a Living
有人尝试解决这个问题:http://www.codeproject.com/Articles/474279/Implementing-Undo-Redo-feature-for-DbContext-of-En - romanoza
1个回答

1
有几种方法可以实现这个功能。总体而言,提供一个明确的解决方案还有些困难,但以下是一些想法:
  • 不要立即删除,你可以创建一个任务,在一定时间内运行该任务进行删除。比如10秒钟。在这10秒钟内,您可以显示一个“撤销”按钮来取消运行SaveChanges()的任务。
  • 您可以将要删除的项目缓存到临时表中并恢复它。
  • 您可以在表中添加一个IsDeleted位,用于表示记录已被删除,可以随意翻转以进行“未删除”操作。

1
我在大多数项目中使用IsDeleted标志,但很遗憾从未想出更好的想法。 - romanoza
这绝对是最简单的方法,但可能会导致膨胀。其他解决方案需要其他运行进程或临时文件,这些更难以完美地维护。 - DLeh
1
我使用DeleteDate,它是DateTime?类型的。如果它为空,则表示未被删除,但如果它有值,则表示已被删除,并且您可以获得删除时间。 - Medo

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