0

对不起我的英语,我会尽我所能。

我有实体“Usuario”,它从 rbacManager 接收对象,调用 Login 方法(见下文)。如您所见,此方法在无法同时匹配用户和密码时引发异常。在这种情况下,我必须增加属性 Intentos,以允许用户只有 3 次失败的机会。

问题如下: SaveChanges 方法没有保存在 Usuario 中修改的值。我认为 SaveChanges 方法由于异常而失败,但我不确定。我在网上找不到任何帮助。

这是操作方法登录:

using(EntitiesModel dbContext = new EntitiesModel())
        {
            try
            {
                string hPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(model.Password, "SHA1");

                Usuario usuario = this.rbacManager.Login(model.UserName, hPassword);

                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                    return RedirectToAction("Index", "Home");

            }
            catch (LoginIncorrectoException)
            {
                dbContext.SaveChanges();
                ViewData["Message"] = "User incorrect.";
            }
            catch (UsuarioBloqueadoException)
            {
                ViewData["Message"] = "User locked";
            }

            return View(model);
        }

第四行的方法 Login 抛出异常:

using (EntitiesModel context = new EntitiesModel())
        {
            Usuario usuario = this.GetUsuario(username);

            if (usuario == null)
                throw new LoginIncorrectoException();

            if (!usuario.EstaActivo())
            {
                throw new UsuarioBloqueadoException();
            }

            if (usuario.Password != password)
            {
                usuario.Intentos++;

                if (usuario.Intentos >= 3)
                {
                    usuario.Activo = false;
                    context.SaveChanges();
                    throw new UsuarioBloqueadoException();
                }
                else
                {
                    context.SaveChanges();
                    throw new LoginIncorrectoException();
                }
            }

            usuario.Intentos = 0;

            return usuario;
        }

编辑:我复制 GetUsuario 方法。

  private Usuario GetUsuario(string username)
    {
        using (EntitiesModel context = new EntitiesModel())
        {
            List<Usuario> Usuarios = context
               .Usuarios
               .Where(x => x.Username == username)
               .ToList();

            if (Usuarios.Count == 1)
                return Usuarios.First();
            else
                throw null;
        }
    }

任何人都知道为什么 SaveChanges 不起作用?谢谢!

4

2 回答 2

1

您的问题在于每个方法都在创建和处理自己的 DbContext。因此,当 GetUser 调用返回 User 对象时,它会从 DbContext 中分离出来,因为您已经处理了它。现在不会保存对该用户对象的更改。最直接的解决方法是将在 Login 方法中创建的 EntitiesModel 传递给 GetUser 方法。当然,您应该研究和实施更好的工作单元模式,但这应该可以帮助您克服直接的障碍。您还可以将 GetUser 调用返回的 User 对象附加到在 Login 调用中创建的 EntitiesModel。

于 2013-02-14T14:35:03.927 回答
1

'GetUsuario' 方法正在创建它自己的上下文,并且 'Login' 方法中的上下文没有挂起的更改,因为 'Usuario' 对象由另一个上下文(已被释放)管理。

您应该确保在最初用于获取对象的同一上下文实例上调用“SaveChanges”。

于 2013-02-14T15:21:40.860 回答