I have an existing ASP.NET MVC app that uses Identity 2.0. I'm trying to query the user objects using a new Core 2.1 app with Ef Core 2.1.
I'm querying directly rather than using UserManager / RoleManager as the .NET MVC and .NET core apps have different versions and I don't want to get myself into any trouble down the track.
My problem is that I cannot get all the users in a particular role.
I am trying to do itvlike this in my .net core application:
public partial class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
    { }
    public virtual DbSet<ApplicationUser> AspNetUsers { get; set; }
    public virtual DbSet<AspNetRole> AspNetRoles { get; set; }
    public virtual DbSet<AspNetUserRole> AspNetUserRoles { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<AspNetUserRole>()
                        .HasKey(pc => new { pc.UserId, pc.RoleId });
    }
}
My model to map the roles:
public class AspNetRole
{
    [Key]
    public Guid Id { get; set; }
    [MaxLength(256)]
    [Required]
    public string Name {get; set;}
    public virtual ICollection<AspNetUserRole> AspNetUserRoles {get; set;}
}
My model to map the users:
 public class ApplicationUser : IdentityUser
{
    public virtual ICollection<AspNetUserRole> AspNetUserRoles {get; set;}
}
and my join table:
public class AspNetUserRole
{
    [MaxLength(256)]
    [Required]
    public Guid UserId { get; set; }
    public ApplicationUser User {get; set;}
    [MaxLength(256)]
    [Required]
    public Guid RoleId { get; set; }
    public AspNetRole Role {get; set;} 
}
The query that I am running in my repository is this:
    var usersInRole = _context.AspNetRoles
        .Where(p => p.Name == "Manager")
        .SelectMany(p => p.AspNetUserRoles)
        .Select(pc => pc.User);
However the query is failing. EF is translating is as follows (I've taken out a bunch of fields from the SELECT statement):
SELECT [p.AspNetUserRoles.User].[Id], [p.AspNetUserRoles.User].[UserName] FROM [AspNetRoles] AS [p] INNER JOIN [AspNetUserRoles] AS [p.AspNetUserRoles] ON [p].[Id] = [p.AspNetUserRoles].[RoleId] LEFT JOIN [AspNetUsers] AS [p.AspNetUserRoles.User] ON [p.AspNetUserRoles].[UserId1] = [p.AspNetUserRoles.User].[Id] WHERE [p].[Name] = @__role_0
As you can see it's incorrectly querying [p.AspNetUserRoles].[UserId1] and therefore gives the following error:
System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'UserId1'.
You need to add following code in addition to your code in OnModelCreating method of ApplicationDbContext class 
modelBuilder.Entity<AspNetUserRole>()
    .HasOne(aur => aur.User)
    .WithMany(aur => aur.AspNetUserRoles)
    .HasForeignKey(aur => aur.UserId);
modelBuilder.Entity<AspNetUserRole>()
    .HasOne(aur => aur.Role)
    .WithMany(aur => aur.AspNetUserRoles)
    .HasForeignKey(aur => aur.RoleId);
 Mohsin Mehmood
 Mohsin MehmoodUser contributions licensed under CC BY-SA 3.0