2013-11-21 44 views
2

我正在處理一個ASP.NET web表單項目,該項目具有奇怪行爲的用戶存儲庫的實現。我遇到以下行爲:EntityFramework上下文返回舊數據

  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; 
    } 
} 
+0

對我來說這似乎很奇怪。我認爲你提供的代碼是正確的。這個問題似乎在其他地方顯然... – sjkm

+0

我會同意,除了沒有多少其他。後面的代碼調用_userRepository.ValidateUser()來查詢數據庫以查看登錄是否有效。在用戶之前加載並且密碼已更改後,ValidateUser()返回false。 – Scott

+0

您完全確定每個請求都獲得了存儲庫的新實例嗎?你如何改變db中的用戶記錄?還通過實體框架? – sjkm

回答

0

我想我有同樣的問題。問題是MembershipProvider只實例化了一次,並且您可能在其構造函數中創建了上下文,這就是爲什麼當您在方法ValidateUser中移動上下文初始化時它會起作用。

0

如果其中一個實體鍵已經改變,實體框架只會查找更改。

當我遇到類似的問題時,我使用dateModified字段(每個表格使得這個字段被更改時)作爲實體關鍵字,因爲所有更改都以完美和快速的方式進行。在相同的上下文實例中。

相關問題