Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc SaveChanges()不';在抛出异常之前无法工作_Asp.net Mvc_Openaccess - Fatal编程技术网

Asp.net mvc SaveChanges()不';在抛出异常之前无法工作

Asp.net mvc SaveChanges()不';在抛出异常之前无法工作,asp.net-mvc,openaccess,Asp.net Mvc,Openaccess,对不起我的英语,我会尽我所能学好的 我有一个实体“Usuario”,它从rbacManager接收对象,调用Login方法(见下文)。如您所见,此方法在无法同时匹配用户和密码时引发异常。在这种情况下,我必须增加属性Intentos,以允许用户只有三次失败的机会 问题如下:SaveChanges方法未保存在Usuario中修改的值。我认为SaveChanges方法由于异常而失败,但我不确定。我在网上找不到任何帮助 这是操作方法登录: using(EntitiesModel dbContext =

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

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

问题如下: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;
        }
    }
private-Usuario-GetUsuario(字符串用户名)
{
使用(EntitiesModel上下文=新EntitiesModel())
{
列表Usuarios=上下文
Usuarios先生
.Where(x=>x.Username==Username)
.ToList();
如果(Usuarios.Count==1)
返回Usuarios.First();
其他的
抛出空值;
}
}
有人知道为什么SaveChanges不起作用吗?
谢谢

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

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


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

例外情况是退出该方法,我将在登录时捕获它,如您所见。SaveChanges不保存在Usuario对象中修改的值,例如,当我必须增加要记录的机会计数器时,“Usuario.Intentos++”,或当我在3次失败的日志后锁定用户时,“Usuario.Activo=false”。我在Login方法中这样做。你能展示GetUsuario方法的主体吗?