У меня есть приложение со следующими отношениями между пользователем и ролью:
modelBuilder.Entity<User>()
.HasMany(c => c.Roles)
.WithMany(p => p.Users)
.Map(
m => {
m.MapLeftKey("UserId");
m.MapRightKey("RoleId");
m.ToTable("UserRole");
});
Довольно стандартные вещи.У меня есть customRoleProvider, настроенный следующим образом:
public class CustomRoleProvider : RoleProvider
{
private readonly IUnitOfWork _unitOfWork;
public CustomRoleProvider()
{
_unitOfWork = DependencyResolver.Current.GetService<IUnitOfWork>();
}
public CustomRoleProvider(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
...
public override string[] GetRolesForUser(string username)
{
var user = _unitOfWork.UserRepository.GetUser(username);
var roles = from r in user.Roles
select r.Name;
if (roles != null)
return roles.ToArray();
else
return new string[] { };
}
public override bool IsUserInRole(string username, string roleName)
{
var user = _unitOfWork.UserRepository.GetUser(username);
var roles = from r in user.Roles
select r.Name;
return roles.Any(r => r.Equals(roleName, StringComparison.CurrentCultureIgnoreCase));
}
...
}
Кажется, что это работает нормально и возвращает роли нормально с исключением.Если вы добавляете роли через что-то вроде:
user.Roles.Add(role);
_db.SaveChanges();
Код не находит новую роль до тех пор, пока вы не перезапустите приложение, что не очень хорошо.
В результате экспериментов, которые я нашелчто, если я создаю экземпляр unitOfWork всякий раз, когда он мне нужен, будет найден полный список ролей:
public override string[] GetRolesForUser(string username)
{
**var unitOfWork = new UnitOfWork();**
var user = unitOfWork.UserRepository.GetUser(username);
var roles = from r in user.Roles
select r.Name;
if (roles != null)
return roles.ToArray();
else
return new string[] { };
}
Однако я не очень хочу использовать этот подход.
Кто-нибудь знает, как исправитьэто?