【问题标题】:Entity Framework 5 Remove() not deleting from the databaseEntity Framework 5 Remove() 未从数据库中删除
【发布时间】:2019-01-12 22:11:16
【问题描述】:

我有一个用户对象,当使用 DbContext 上的 Remove() 删除它时,它并没有从数据库中删除。奇怪的是,我检索用户的查询不再返回它。

此代码通过我的应用程序使用,并且适用于其他实体,没有任何问题。

我真的很感激关于这可能是什么的建议,因为我很难过!

#region Delete
    public virtual void Delete(User entity)
    {
        var user = _context.Users.FirstOrDefault(u => u.UserId == entity.UserId);
        if (user != null)
        {
            user.Roles.Clear();
            var actionHistories = _context.ActionHistories.Where(u => u.User.UserId == user.UserId);
            foreach (var actionHistory in actionHistories)
            {
                _context.ActionHistories.Remove(actionHistory);
            }
            _context.Users.Remove(user);

            _context.SaveChanges();
        }
    }
    #endregion

P.S 删除 Roles 和 ActionHistories 的代码是我添加的,用于测试问题是否与存在的相关实体有关,但并没有解决问题。

【问题讨论】:

  • 您是否在 Delete 方法之外打开了事务?在您提交事务之前,不会从数据库中删除实体。使用相同上下文的其他查询不会看到已删除的User,因为上下文中的实体标记为deleted
  • “它没有从数据库中删除。奇怪的是,我检索用户的查询不再返回它。” - 然后分析它。您是否使用自定义DbContext,例如设置Deleted 标志而不是硬删除行?您如何查询用户,如果该行仍然存在,为什么不返回它?您的应用程序在检查数据库时是否使用与您相同的连接字符串?
  • 没有错误或异常。一切似乎都正常,直到我检查数据库并看到记录仍然存在
  • @CodeCaster 不,这是硬删除,因为它会从数据库中删除用户......好吧,这就是它应该做的。 GetQueries 类似 GetAll 从数据库中
  • 但是“我的检索用户查询不再返回它虽然”并不意味着您可以重新启动计算机,用户仍在数据库中并且您运行对这个用户的查询没有结果,还是这样?

标签: c# .net entity-framework


【解决方案1】:

尝试添加:

_context.Entry(user).State = EntityState.Modified;

之前

_context.SaveChanges();

【讨论】:

    【解决方案2】:

    我使用了与 @tomsullivan1989 相同的答案,但使用的是 EntityState.Deleted; 它解决了我的类似问题。哪个有错误信息 无法更改关系,因为一个或多个外键属性不可为空

    【讨论】:

      【解决方案3】:

      我的建议是尝试使用分析工具(例如,来自 hibernate rhino's 的 EFprof,它有免费试用版)。

      它将准确地向您显示 SQL EF 生成的内容,因此您可以看到当您跳过 SaveChanges 时会发生什么。

      听起来确实很奇怪,也许有一些静默 SQL 错误被抛出,分析器可能会发现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2016-07-07
        • 2016-11-09
        • 1970-01-01
        • 2012-10-30
        相关资源
        最近更新 更多