有用户角色时Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole到return为空集正常吗?
Is it normal for Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole to return an empty set when there are user roles?
我正在尝试 return 属于不同 IdentityRole
和不属于任何角色的 ApplicationUser
的列表。
因此,当我进行测试时,我注意到以下语句为我提供了系统中的所有用户。
UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0);
对我来说,声明应该意味着如果用户没有角色,它应该 return 它作为集合的一部分但显然在调试时,所有用户 return 计数0.
如果我使用适当的 RoleManager 来确定用户是否属于该角色,我会得到正确的答案:
UserManager.IsInRole(applicationUser.Id, "Administrator");
所以我想弄清楚return一个空集是否正常。
同样在我的数据库中,aspnetuserroles
table identityusers
的外键似乎指向错误的列或代码正在更新到错误的列。
table 看起来像这样:
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
列全部为 null,由于某种原因被引用。
非常感谢任何建议。
我做了一点测试,发现使用
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();
我正在尝试 return 属于不同 IdentityRole
和不属于任何角色的 ApplicationUser
的列表。
因此,当我进行测试时,我注意到以下语句为我提供了系统中的所有用户。
UserManager.Users.Include(x => x.Roles).Where(u => u.Roles.Count == 0);
对我来说,声明应该意味着如果用户没有角色,它应该 return 它作为集合的一部分但显然在调试时,所有用户 return 计数0.
如果我使用适当的 RoleManager 来确定用户是否属于该角色,我会得到正确的答案:
UserManager.IsInRole(applicationUser.Id, "Administrator");
所以我想弄清楚return一个空集是否正常。
同样在我的数据库中,aspnetuserroles
table identityusers
的外键似乎指向错误的列或代码正在更新到错误的列。
table 看起来像这样:
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
列全部为 null,由于某种原因被引用。
非常感谢任何建议。
我做了一点测试,发现使用
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();