2013-02-14 2 views
0

영어로 죄송합니다. 가능한 한 잘 할 것입니다.예외가 발생하기 전에 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가 작동하지 않는 이유를 알고 계실 것입니다. 감사합니다.

+0

예외는 메서드에서 종료하는 것입니다, 나는 당신이 볼 수 있듯이 그것을 logOn에서 잡아냅니다. SaveChanges는 Usuario 개체에서 수정 된 값을 저장하지 않습니다. 예를 들어 "usuario.Intentos ++"와 같이 로그 기회를 늘리거나 "usuario.Activo = false"를 지정하면 3 개의 실패한 로그 후에 사용자를 잠글 수 있습니다. 나는 로그인 방법에서 그렇게한다. –

+0

GetUsuario 메소드의 본문을 표시 할 수 있습니까? –

답변

1

각 메서드가 자체 DbContext를 만들고 처리한다는 사실에 문제가 있습니다. 따라서 GetUser 호출이 User 객체를 반환하면 사용자 객체를 폐기 했으므로 DbContext에서 분리됩니다. 이제 해당 사용자 개체에 대한 변경 사항이 저장되지 않습니다. 가장 즉각적인 해결 방법은 Login 메서드에서 만든 EntitiesModel을 GetUser 메서드에 전달하는 것입니다. 물론 연구하고 구현해야하는 작업 단위 패턴이 더 좋지만이 작업은 즉각적인 장애물을 가로 질러 진행해야합니다. GetUser 호출로 반환 된 User 개체를 Login 호출 내에서 만든 EntitiesModel에 연결할 수도 있습니다.

+0

덕분에 많이, 나는 당신의 조언을 따라 드리겠습니다 –

1

'GetUsuario'메서드는 자체 컨텍스트를 만들고 'Usuario'개체가 다른 컨텍스트 (이미 삭제 된 개체)로 관리되기 때문에 'Login'메서드의 컨텍스트에 보류중인 변경 내용이 없습니다.

먼저 'SaveChanges'가 개체를 가져 오는 데 사용 된 동일한 컨텍스트 인스턴스에서 호출되어야합니다.

+0

감사합니다! –

관련 문제