В моем приложении ASP.NET MVC 5 я хочу перечислить роли пользователя. Я загрузил некоторые образцы, которые, кажется, сломаны. В основном я хочу как идентификатор роли, так и имя роли ролей выбранного пользователя (а не текущего пользователя!).Невозможно создать постоянное значение типа «IdentityUserRole». Поддерживаются только примитивные типы или типы перечислений
ApplicationUser.Roles дает мне объект IdentityUserRole с только RoleId и UserId.
ApplicationDbContext.Roles дает мне IdentityRole с RoleId, RoleName и т. Д. Всех ролей приложений.
Так что я хочу, это набор результатов с пересечением обоих наборов, сохраняя при этом полную информацию о роли, чтобы я мог использовать как ее идентификатор роли, так и имя роли.
Я попробовал Intersect(), но это не сработало, потому что оба объекта имеют разный тип. Я попробовал тупой стиль перебор, но получил исключение говоря, что чтения данных уже активны, так что я озадачен :(
Я попытался следующим на LINQPad (с соответствующими разными цветами и пространствами имен):
string UserName = "[email protected]";
ApplicationDbContext ctx = new ApplicationDbContext();
var allroles = ctx.Roles.OrderBy(r => r.Id);
allroles.Dump(); // dumps well, 6 roles
ApplicationUser user = ctx.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var myroles = user.Roles;
myroles.Dump(); // dumps well, 3 roles
IEnumerable<IdentityRole> list = from roles in allroles
join uroles in myroles
on roles.Id equals uroles.RoleId
select roles;
list.Dump(); // exception
И хотя запрос, по-видимому, не вызывает ошибки во время выполнения, его демпинг делает независимо от того, использую ли я Dump() или явный foreach (элемент IdentityRole в списке). Ошибка, которую я получаю в этом случае:
«Невозможно восстановить постоянное значение типа «Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole». Только примитивные типы или перечисление в этом контексте поддерживаются типы ".
Вы пробовали делать вместо выбора ролей, выберите новый IdentityRole {Id = роль.Id, Name = role.Name} .ToList(); – grimurd
Не могли бы вы пометить один из ответов так, как это принято, поэтому SO не столкнется с этим вопросом на первой странице? –