2010-03-24 4 views
1

사용자가 사용자 이름을 변경할 수있는 섹션이 페이지에 있습니다. 이것은 그것을 위해 기본적으로 코드 :GetRolesForUser가 이전 사용자 이름에서 역할을 얻으려고합니까?

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

사용자는 내 DBML의 클래스이며, 저장 데이터 컨텍스트에 SubmitChanges를 호출합니다.

데이터베이스에서 이름이 변경되므로 다음 방법을 호출 할 때 데이터베이스에있는 사용자 이름 대신 이전 사용자 이름으로 사용자를 얻으려고하기 때문에 이름이 잘못되었습니다.

답변

1

얼마 전부터 GetRolesForUser에 사용 된 직류가 그대로 유지됩니다. 따라서 이전에 사용자를 다시 얻은 다음 동일한 사용자에게 다시 요청하면 동일한 데이터 컨텍스트를 사용하여 해당 데이터 컨텍스트로 캐시 된 사용자를 반환합니다.

음 사용자 이름 매개 변수는 이전 사용자 이름, 당신은 이전 사용자를 위해 어떤 역할을 반환하지 올바르게 작품을 제공하는 기능을 보유하고있는 경우

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>(); 
    } 
} 

편집을 사용하여보십시오 ... 만들기 새 사용자 이름을 함수에 전달했는지 확인하십시오. 나는. 그것은 기능의 문제가 아니라 기능에 전달되는 가치를 보유하는 문제입니다.

2 편집 현재 사용자의 자격 증명을 변경하지 않는 데이터베이스에 사용자를 저장

(A RoleProvider를 사용하는 것을 알고 후). 로그인 중에 설정됩니다. cou를 확인하려면 HttpContext.User에 여전히 사용자 이름이 있는지 여부를 확인할 수 있습니다. 그래서 당신이해야 할 일은 uer가 다시 로그인하도록 강요하거나, imutable 식별자를 자격 증명으로 사용하는 것입니다. 각 사용자에게 GUID가 할당되면 사용자 이름이 변경 될 수 있고 역할은 여전히 ​​해결 될 수 있습니다.

+0

방금 ​​시도했지만 작동하지 않았습니다. GetRolesForUser가 호출되는 클래스는 실제로 새로운 데이터 컨텍스트를 생성합니다. 난 여전히 같은 오류가있어, 그것은 이전 사용자 이름에서 사용자 이름 변수에 전달됩니다. – Xaisoft

+0

이 솔루션이 작동하지 않으면 실제로 저장하기 전에 값을 가져 오는 중임을 나타내는 수명주기 문제가 있습니다. – citronas

+0

수명주기는 다음과 같습니다. 사용자에게 새 사용자 이름이 지정되었습니다. SubmitChanges가 호출되었습니다. GetRolesforUser가 호출되었지만 이전 사용자 이름이 전달되었습니다. – Xaisoft

관련 문제