EF Core 2.0角色导航属性仅适用于集合中的一个用户

时间:2018-06-06 12:05:11

标签: c# asp.net-core entity-framework-core

我按照指南进行了操作: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();

(请注意,我的数据库中有两个用户)

以下是我的证明问题的屏幕截图:

enter image description here

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

1 个答案:

答案 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;
}