EntityFramework上下文返回旧数据

时间:2013-11-21 18:12:41

标签: c# entity-framework

我正在开发一个ASP.NET Web表单项目,该项目具有一个奇怪的用户存储库实现。我遇到了以下行为:

  1. 用户使用有效的用户名/密码登录。他们成功进入。
  2. 用户退出。
  3. 我更改了数据库中的密码(出于参数的缘故)。
  4. 用户使用新密码再次登录。但是,登录被拒绝为无效。
  5. 如果我在"用户"设置断点。在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;
        }
    }
    

2 个答案:

答案 0 :(得分:0)

我想我有同样的问题。问题是MembershipProvider只被实例化一次,你可能在它的构造函数中创建了上下文,这就是当你在方法ValidateUser中移动你的上下文初始化时它的工作原理。

答案 1 :(得分:0)

如果其中一个实体密钥发生了变化,实体框架只会查找更改。

当我遇到类似的问题时,我将dateModified字段(我创建的每个表这样的字段来跟踪它何时被更改)作为实体键,从那时起所有的更改都变得完美而快速。在相同的上下文实例中。