首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核心查询自定义IdentiyUser

EF核心查询自定义IdentiyUser
EN

Stack Overflow用户
提问于 2019-09-19 16:02:50
回答 1查看 100关注 0票数 0

我仍然是相对较新的EF核心和之前我使用PetaPoco,所以请原谅我的无知。在我的数据库中,我在AspNetUsers表中添加了以下字段:

  • 高架
  • 失活
  • FirstName
  • LastName

然后,我按照这篇博客文章创建了以下类

代码语言:javascript
复制
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; }
}

代码语言:javascript
复制
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方法。

从这一点出发,我不理解的是如何查询表,返回我的自定义属性。在我的控制器里,我想做这样的事情:

代码语言:javascript
复制
/// <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);
}

但显然我做不到,因为用户DbSet上不存在这些属性。

长话短说,我认为我已经把所有的设置都做好了,但是如何真正地查询我的扩展IdentityUser呢?

编辑

按照要求,下面是我的DbContext。我现在只连接了一个虚拟表,因为我只是想让AspNetUsers表上的扩展首先正常工作:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-19 16:18:19

您必须为IdentityDbContext指定类型参数。您需要从班级继承。如果没有类型参数,您将使用在ASP.NET核心标识中定义的类。您想要更改的所有内容都必须反映在代码中。

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58014966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档