【问题标题】:EntityFramework context returning old dataEntityFramework 上下文返回旧数据
【发布时间】:2014-02-27 06:26:22
【问题描述】:

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

  1. 用户使用有效的用户名/密码登录。他们成功进入。
  2. 用户退出。
  3. 我更改了数据库中的密码(为了论证)。
  4. 用户使用新密码再次登录。但是,登录被视为无效而被拒绝。

如果我在 ValidateUser() 方法中的“用户”变量处设置断点并检查密码,即使数据库清楚地保存了新密码,它也有旧密码。在我看来,存储库的体系结构存在一些问题,导致它加载旧的上下文或类似的东西,但是每次实例化类时它都会创建一个新的 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;
    }
}

【问题讨论】:

  • 这对我来说似乎很奇怪。我认为您提供的代码是正确的。问题似乎显然在其他地方......
  • 我会同意,除了没有什么其他的。后面的代码调用 _userRepository.ValidateUser() 查询数据库以查看登录是否有效。 ValidateUser() 在之前加载用户并且密码更改后返回 false。
  • 您完全确定每个请求都会获得一个新的存储库实例吗?以及如何更改数据库中的用户记录?也通过实体框架?
  • 是的,每个请求都会获得一个新实例(我设置了一个断点以确保)。密码是通过同一个存储库更改的,但是我是通过代码更改它还是只是在数据库中手动更改它并不重要。一旦为特定用户调用了 ValidateUser(),一旦密码更改再次调用它就会失败,无论使用什么机制来更改它。
  • 在ValidateUser方法中设置断点,第二次登录失败时查看数据库中的值是什么

标签: c# entity-framework


【解决方案1】:

我想我有同样的问题。问题是 MembershipProvider 仅被实例化一次,您可能在其构造函数中创建了上下文,这就是为什么当您在方法 ValidateUser 中移动上下文初始化时它会起作用。

【讨论】:

    【解决方案2】:

    实体框架仅在实体键之一发生更改时查找更改。

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

    【讨论】:

      猜你喜欢
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2020-07-05
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多