2010-03-24 2 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 вокруг в течение некоторого времени. Поэтому, если вы повторно загрузили пользователя и затем снова попросите одного и того же пользователя, используя тот же контекст данных, он вернет пользователя, кэшированного этим контекстом данных.

Попробуйте использовать

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

Редактировать

Ну если параметр имя пользователя содержит старое имя пользователя, функцию, которую при условии работы правильно не возвращает никаких ролей для старого пользователя ... сделать убедитесь, что вы передали новое имя пользователя в функцию. То есть это проблема того, где вы храните значение, которое передается в funcion, а не проблема функции.

второй Редактировать (После того, зная, что используется RoleProvider)

Сохранение пользователя в базе данных не изменяет учетные данные текущего пользователя. Они устанавливаются во время входа в систему. Для проверки cou может проверить, сохраняет ли имя HttpContext.User имя пользователя. Так что вам нужно сделать, либо заставить uer снова войти в систему, либо использовать в качестве учетных данных инсайдерский идентификатор, например. направляющий, назначенный каждому пользователю, тогда имя пользователя может измениться, и роли все еще могут быть разрешены.

+0

Я просто попробовал это, и это не сработало. Класс, в котором вызван метод GetRolesForUser, фактически создает новый контекст данных. Я по-прежнему получаю ту же ошибку, она переводит старое имя пользователя в переменную имени пользователя. – Xaisoft

+0

Если это решение не работает, у вас есть проблема жизненного цикла, указывающая на то, что вы пытаетесь получить значение до его фактического хранения. – citronas

+0

жизненный цикл выглядит так: Пользователю назначено новое имя пользователя. Вызывается SubmitChanges. Вызывается GetRolesforUser, но старое имя пользователя передается. – Xaisoft

Смежные вопросы