EF Core Query Custom IdentiyUser - PullRequest
       15

EF Core Query Custom IdentiyUser

0 голосов
/ 19 сентября 2019

Я все еще относительно новичок в EF Core и заранее использовал PetaPoco, поэтому, пожалуйста, прости мое невежество.В моей базе данных я добавил следующие поля в свою таблицу AspNetUsers:

  • Повышен
  • Деактивирован
  • Имя_100 *
  • Имя

Затем я создал следующие классы, следуя этой статье блога :

public partial class ApplicationUser : IdentityUser
{
    public bool? Deactivated { get; set; }
    public bool? Elevated { get; set; }
    [StringLength(255)]
    public string FirstName { get; set; }
    [StringLength(255)]
    public string LastName { get; set; }
}

и

public class ApplicationClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser, IdentityRole>
{
    public ApplicationClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
    { }

    public override async Task<ClaimsPrincipal> CreateAsync(ApplicationUser user)
    {
        var principal = await base.CreateAsync(user);

        if (!string.IsNullOrWhiteSpace(user.FirstName))
        {
            ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                new Claim(ClaimTypes.GivenName, user.FirstName)
            });
        }

        if (!string.IsNullOrWhiteSpace(user.LastName))
        {
            ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                new Claim(ClaimTypes.Surname, user.LastName)
            });
        }

        return principal;
    }
}

Я также настроил AddIdentity и AddScoped Методы тоже в моем файле Startup.cs.

В дальнейшем я не понимаю, как выполнить запрос к таблице, возвращая мои пользовательские свойства.В моем контроллере я хочу сделать что-то вроде этого:

/// <summary>
/// Gets every User.
/// </summary>
/// <returns>HTTP Result</returns>
[HttpGet]
[Route("")]
public async Task<ActionResult<IEnumerable<ApplicationUser>>> GetUsers()
{
    var users = await this._context.Users.Select(user => new
    {
        user.Id,
        user.Decativated,
        user.Elevated,
        user.Email,
        user.FirstName,
        user.LastName
    }).ToListAsync();

    return Ok(users);
}

Но, очевидно, я не могу, потому что свойства не существуют в Users DbSet.

Короче говоря,Я думаю, что у меня все настроено правильно, но как мне на самом деле запросить мой расширенный IdentityUser?

EDIT

В соответствии с запросом, мой DbContext является следующим.У меня только фиктивная таблица подключена прямо сейчас, так как я просто пытался заставить работать расширения таблицы AspNetUsers:

public partial class [removed for confidentiality]Context : IdentityDbContext
{
    public [removed for confidentiality]Context()
    {
    }

    public [removed for confidentiality]Context(DbContextOptions<[removed for confidentiality]Context> options)
        : base(options)
    {
    }

    public virtual DbSet<Foo> Foos { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasAnnotation("ProductVersion", "[removed for confidentiality]");

        modelBuilder.Entity<Foo>(entity =>
        {
            entity.Property(e => e.FooName).IsUnicode(false);
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

1 Ответ

1 голос
/ 19 сентября 2019

Вы должны указать параметры типа для IdentityDbContext.Вам нужно наследовать от IdentityDbContext<TUser> класс .Без параметров типа вы используете классы, определенные в ASP.NET Core Identity.Все, что вы хотите изменить, должно быть отражено в вашем коде.

public partial class [removed for confidentiality]Context : IdentityDbContext<ApplicationUser>
{
    public [removed for confidentiality]Context()
    {
    }

    public [removed for confidentiality]Context(DbContextOptions<[removed for confidentiality]Context> options)
        : base(options)
    {
    }

    public virtual DbSet<Foo> Foos { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasAnnotation("ProductVersion", "[removed for confidentiality]");

        modelBuilder.Entity<Foo>(entity =>
        {
            entity.Property(e => e.FooName).IsUnicode(false);
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
...