我按照指南进行了操作:reference
当我尝试在我的用户集合中使用include Roles时,其中只有一个实际返回角色。尽管数据库中存在任何用户,但其他用户没有任何角色收集。感觉就像角色只为一个用户填写。 如果我更好地改变OrderBy条件,那将是另一个将拥有角色的用户。
我真的不知道什么会造成这种行为。
这是允许角色导航的代码。
在我的用户环境中:
builder.Entity<ESUserIdentity>()
.HasMany(e => e.Roles)
.WithOne()
.HasForeignKey(e => e.UserId)
.IsRequired()
.OnDelete(DeleteBehavior.Cascade);
builder.Entity<IdentityUserRole<Guid>>(i =>
{
i.ToTable("AspNetUserRoles");
i.HasKey(x => new { x.RoleId, x.UserId });
});
在我的用户身份中:
public class ESUserIdentity : IdentityUser<Guid>
public virtual ICollection<IdentityUserRole<Guid>> Roles { get; } = new List<IdentityUserRole<Guid>>();
在我的服务中:
services.AddIdentity<ESUserIdentity, IdentityRole<Guid>>()
.AddEntityFrameworkStores<ESUsersContext>()
.AddDefaultTokenProviders();
我使用的查询:
identities = await _dbUsers.Users
.Include(r => r.Roles)
.OrderBy(order)
.Where(q =>
(q.FullName != null && q.FullName.ContainsValue(query.search) ||
q.UserName != null && q.UserName.ContainsValue(query.search) ||
q.Email != null && q.Email.ContainsValue(query.search) ||
query.search == null) &&
q.Companyid == cieId &&
q.Deleted == false)
.Skip((query.limit * (query.page - 1))).Take(query.limit)
.AsNoTracking().ToArrayAsync();
(请注意,我的数据库中有两个用户)
以下是我的证明问题的屏幕截图:
SQL从此方法生成IQueryableExtensions - &gt; https://github.com/aspnet/EntityFrameworkCore/issues/6482 似乎不转换所有:
SELECT [r].[Id], [r].[AccessFailedCount], [r].[Companyid], [r].[ConcurrencyStamp], [r].[Deleted], [r].[DeletedDate], [r].[Email], [r].[EmailConfirmed], [r].[FullName], [r].[HasSeenTutorial], [r].[Language], [r].[LockoutEnabled], [r].[LockoutEnd], [r].[NormalizedEmail], [r].[NormalizedUserName], [r].[PasswordHash], [r].[PhoneNumber], [r].[PhoneNumberConfirmed], [r].[SecurityStamp], [r].[Status], [r].[TimezoneId], [r].[TwoFactorEnabled], [r].[UserName]
FROM [AspNetUsers] AS [r]
WHERE [r].[Deleted] = 0
ORDER BY [r].[Id] DESC
答案 0 :(得分:0)
它是由我在任何地方使用的ContainsValue扩展方法引起的,但出于某种原因,当使用角色时,这些将不会包含在第一个用户中。
方法:
public static bool ContainsValue(this string str, string value)
{
bool rs = false;
if (str != null && value != null)
rs = str.ToUpper().Contains(value.ToUpper());
return rs;
}