2010-03-24 26 views
1

我在頁面上有一個部分,用戶可以更改他們的用戶名。這是基本的代碼爲:GetRolesForUser嘗試獲取舊用戶名上的角色?

user.UserName = txtNewUserName.Text; 
user.Save(); 

用戶在我的dbml類和節省話費的數據上下文的SubmitChanges。

數據庫中的名稱已更改,因此當它調用以下方法時,它將失敗,因爲它試圖使用舊用戶名而不是現在數據庫中的用戶。

public override string[] GetRolesForUser(string username) 
{ 
    return dc.Users.Where(u => u.UserName== username) 
        .SingleOrDefault().Roles 
        .Select(r => r.RoleName).ToArray<string>(); 
} 

回答

1

看樣子你保持GetRolesForUser使用了一段時間的DC。因此,如果您之前已經回顧了用戶,然後再次請求同一用戶,則使用相同的數據上下文,它將返回該數據上下文所緩存的用戶。

使用

public override string[] GetRolesForUser(string username) 
{ 
    using (var ctx = new MyDataContext()) { 
     return ctx.Users.Where(u => u.UserName== username) 
         .SingleOrDefault().Roles 
         .Select(r => r.RoleName).ToArray<string>(); 
    } 
} 

編輯

那麼,如果用戶名參數保存舊的用戶名,你在不返回任何角色爲老用戶提供正確的作品功能的Try ...使確保你將新的用戶名傳遞給函數。即這是一個問題,你持有傳入函數的值,而不是函數的問題。

第二編輯

保存用戶對數據庫不改變當前用戶的憑證(知道一個RoleProvider使用之後)。這些都是在登錄時設置的。要驗證cou可以檢查HttpContext.User是否仍然保存用戶名。因此,您需要做的是強制用戶再次登錄,或者使用不可變的標識符作爲憑證,例如,分配給每個用戶的guid,則用戶名可以更改,角色仍然可以解決。

+0

我剛試過這個,它沒有工作。 GetRolesForUser被調用的類實際上是創建一個新的數據上下文。我仍然遇到同樣的錯誤,它將舊用戶名傳遞給用戶名變量。 – Xaisoft 2010-03-24 23:11:05

+0

如果此解決方案無法正常工作,那麼您的生命週期問題表明您正在嘗試在實際存儲該值之前獲取該值。 – citronas 2010-03-24 23:42:38

+0

生命週期就像這樣: 用戶被分配一個新的用戶名。 SubmitChanges被調用。 GetRolesforUser被調用,但舊用戶名被傳入。 – Xaisoft 2010-03-25 00:12:45