我正在开发一个ASP.NET Web表单项目,该项目具有一个奇怪的用户存储库实现。我遇到了以下行为:
如果我在"用户"设置断点。在ValidateUser()方法中的变量并检查密码,即使数据库明确保存了新密码,它也有OLD密码。在我看来,存储库的体系结构存在一些问题,导致它加载旧的上下文或类似的东西,但每次实例化类时它都会创建一个新的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;
}
}
答案 0 :(得分:0)
我想我有同样的问题。问题是MembershipProvider只被实例化一次,你可能在它的构造函数中创建了上下文,这就是当你在方法ValidateUser中移动你的上下文初始化时它的工作原理。
答案 1 :(得分:0)
如果其中一个实体密钥发生了变化,实体框架只会查找更改。
当我遇到类似的问题时,我将dateModified字段(我创建的每个表这样的字段来跟踪它何时被更改)作为实体键,从那时起所有的更改都变得完美而快速。在相同的上下文实例中。