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