0

私の英語で申し訳ありませんが、できる限りうまくやります。

rbacManager からオブジェクトを受け取り、Login メソッドを呼び出すエンティティ「Usuario」があります (以下を参照)。ご覧のとおり、このメソッドは、ユーザーとパスワードの両方が一致しない場合に例外をスローします。この場合、プロパティ Intentos をインクリメントして、ユーザーが失敗する機会を 3 回だけ許可する必要があります。

問題は次のとおりです。SaveChanges メソッドは、Usuario で変更された値を保存していません。例外のために SaveChanges メソッドが失敗していると思いますが、よくわかりません。ウェブ上でヘルプが見つかりませんでした。

これは、Action Method LogOn です。

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);
        }

そして、例外をスローする 4 行目の 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 メソッドに渡すことです。もちろん、調査して実装する必要がある、より優れた Unit Of Work パターンがありますが、これにより当面のハードルを乗り越えることができます。また、GetUser 呼び出しによって返された User オブジェクトを、Login 呼び出し内で作成された EntitiesModel にアタッチすることもできます。

于 2013-02-14T14:35:03.927 に答える