영어로 죄송합니다. 가능한 한 잘 할 것입니다.예외가 발생하기 전에 SaveChanges()가 작동하지 않음
나는 rbacManager에서 객체를 받고, 로그인 메소드를 호출하는 엔터티 "Usuario"를 가지고 있습니다 (아래 참조). 이 메소드는 사용자가 암호를 모두 찾을 수없는 경우 예외를 던집니다. 이 경우 사용자가 실패 할 기회가 세 번만 있기 때문에 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);
}
그리고 예외를 throw 네 번째 줄의 방법 로그인 : :
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가 작동하지 않는 이유를 알고 계실 것입니다. 감사합니다.
예외는 메서드에서 종료하는 것입니다, 나는 당신이 볼 수 있듯이 그것을 logOn에서 잡아냅니다. SaveChanges는 Usuario 개체에서 수정 된 값을 저장하지 않습니다. 예를 들어 "usuario.Intentos ++"와 같이 로그 기회를 늘리거나 "usuario.Activo = false"를 지정하면 3 개의 실패한 로그 후에 사용자를 잠글 수 있습니다. 나는 로그인 방법에서 그렇게한다. –
GetUsuario 메소드의 본문을 표시 할 수 있습니까? –