当有用户角色时,Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole返回一个空集是否正常?

问题描述 投票:0回答:1

我正试图返回一个列表 ApplicationUser 属于不同 IdentityRole 和那些也不属于任何角色的用户。

所以当我进行测试时,我注意到下面的语句给了我系统中的所有用户。

UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0);

对我来说,这条语句的意思应该是,如果用户没有角色,就应该把它作为集合的一部分返回,但显然在调试时,所有的用户都返回0的计数。

如果我使用适当的RoleManager来判断用户是否属于角色,我得到了正确的答案。

UserManager.IsInRole(applicationUser.Id, "Administrator");

所以我想知道它返回一个空集是否正常。

另外,在我的数据库中 aspnetuserroles 表的外键,以 identityusers 似乎指向了错误的列或代码更新到了错误的列。

CREATE TABLE `aspnetuserroles` (
  `UserId` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
  `RoleId` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
  `IdentityUser_Id` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`UserId`,`RoleId`),
  KEY `IdentityRole_Users` (`RoleId`),
  KEY `IdentityUser_Id` (`IdentityUser_Id`),
  CONSTRAINT `IdentityRole_Users` FOREIGN KEY (`RoleId`) REFERENCES `aspnetroles` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `IdentityUser_Roles` FOREIGN KEY (`IdentityUser_Id`) REFERENCES `identityusers` (`Id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

该表看起来是这样的: UserId 列有所有正确的用户ID,但没有被引用。IdentityUser_Id 列都是空的,不知道为什么被引用了。

非常感谢任何建议。

mysql asp.net-mvc entity-framework-6 .net-4.0 asp.net-identity
1个回答
1
投票

我做了一个小测试,发现当使用

UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0);

我也得到了0个结果,尽管我知道肯定不应该是这样。于是,我决定看看调试器里发生了什么。其实是出错了,但我不看调试器就不知道。我不太清楚你想得到什么,但通过在最后抛出一个ToList(),像这样

UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0).ToList();

我开始得到预期的效果。希望对你也有用! 另外,使用下面的方法,我也得到了同样的结果。祝您好运!

UserManager.Users.Where(x => x.Roles.Count == 0).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.