我正在开发一个 ASP.NET Web 窗体项目,该项目实现了一个行为异常的用户存储库。我遇到以下行为:
- 用户使用有效的用户名/密码登录。他们成功进入。
- 用户注销。
- 我更改了数据库中的密码(为了争论)。
- 用户使用新密码再次登录。但是,登录因无效而被拒绝。
如果我在 ValidateUser() 方法中的“user”变量处设置断点并检查密码,即使数据库清楚地保存了新密码,它仍然是旧密码。在我看来,存储库的体系结构存在一些问题,导致它加载旧上下文或类似的内容,但每次实例化类时都会创建一个新的 PortalContext() 。有什么想法吗?
public class BaseRepository
{
protected readonly PortalContext Context = new PortalContext();
}
public class UserRepository : BaseRepository, IUserRepository
{
public bool ValidateUser(string username, string password)
{
var user = Context.Users.FirstOrDefault(x => x.LoginName == username);
if (user == null) return false;
return user.Password == password;
}
}
.NET 代码隐藏
public partial class _default
{
private readonly IUserRepository _userRepository = new UserRepository();
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (_userRepository.ValidateUser(txtUsername.Text, txtPassword.Text)
{
// Log user in
}
}
}
编辑:如果我将 ValidateUser() 更新为以下代码,问题就会消失。这似乎证实了它与它卡在旧上下文上有关。
public bool ValidateUser(string username, string password)
{
using (var context = new PortalContext())
{
var user = context.Users.FirstOrDefault(x => x.LoginName == username);
if (user == null) return false;
return user.Password == password;
}
}
最佳答案
我想我也遇到了同样的问题。问题是 MembershipProvider 仅实例化一次,您可能在其构造函数中创建了上下文,这就是当您将上下文初始化移动到方法 ValidateUser 时它起作用的原因。
关于c# - EntityFramework 上下文返回旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20128756/