Свойство EF Core 2.0 Roles Navigation работает только для одного пользователя в коллекции - PullRequest
0 голосов
/ 06 июня 2018

Я следовал руководству здесь: ссылка

Когда я пытаюсь использовать включение ролей в коллекцию моего пользователя, только одна из них фактически возвращает роли.Другой пользователь не имеет никакой коллекции ролей, несмотря на то, что есть в базе данных.Такое ощущение, что роли заполнены только для одного пользователя.Если я хорошо изменю условие 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 -> 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 голосов
/ 11 июня 2018

Это было вызвано моим методом расширения 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...