DataContext.Users在Razor页面中返回空结果

时间:2018-06-25 05:26:22

标签: asp.net-core asp.net-core-mvc asp.net-identity asp.net-core-2.0 asp.net-core-mvc-2.0

嗨,我在从ASP.NET Core中的Razor页面访问Users表时遇到问题

我创建了一个AppDataContext类,扩展了IdentityDbContext<Models.User, Models.UserRole, string>

我可以将其与其他控制器类和服务一起使用,而不会出现问题。但是,当我开始处理剃须刀页面时,dataContext.Users总是返回空的可枚举值。其他DbSet仍然可以正常工作,只有Users无法正常工作。

当我尝试从其他服务(例如UserManager.UsersSigniInManager.UserManager.Users)访问数据时,也会发生这种情况

这是我文件的一部分

AppDataContext

public class AppDataContext : IdentityDbContext<Models.User, Models.UserRole, string>
{
    // Other DbSet's

    public AppDataContext(DbContextOptions<AppDataContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        // Other entities building

        MapIdentityTables(builder);
    }

    private void MapIdentityTables(ModelBuilder builder)
    {
        builder.Entity<Models.User>().ToTable("Users");
        builder.Entity<IdentityUser>().ToTable("Users");
        builder.Entity<Models.UserRole>().ToTable("UserRoles");
        builder.Entity<IdentityRole>().ToTable("UserRoles");
        builder.Entity<IdentityUserClaim<string>>().ToTable("UserClaims");
        builder.Entity<IdentityUserRole<string>>().ToTable("UserUserRoles");
        builder.Entity<IdentityUserLogin<string>>().ToTable("UserLogins");
        builder.Entity<IdentityRoleClaim<string>>().ToTable("UserRoleClaims");
        builder.Entity<IdentityUserToken<string>>().ToTable("UserTokens");
    }

LoginPage.cshtml.cs

public class LoginModel : PageModel
{
    private readonly Identity.AppUserManager userManager;
    private readonly SignInManager<Models.User> signInManager;
    private readonly Data.AppDataContext dataContext;

    public LoginModel(Identity.AppUserManager userManager, SignInManager<Models.User> signInManager, Data.AppDataContext dataContext)
    {
        this.userManager = userManager;
        this.signInManager = signInManager;
        this.dataContext = dataContext;
    }

    public IList<Model.User> Users { get; private set; }

    public void OnGet()
    {
        Users = userManager.Users.ToList(); // Empty
        Users = signInManager.UserManager.Users.ToList(); // Empty
        Users = dataContext.Users.ToList(); // Empty
    }
}

User

public class User : Microsoft.AspNetCore.Identity.IdentityUser
{
    public ICollection<UserDevice> Devices { get; set; }
    public IList<UserPassword> Passwords { get; set; }
}

我做错了什么还是错过了什么?

更新

在我放弃并做其他事情之后,问题现在已经消失了。但这不是解决方案,因为如果我做同样的事情,原来的问题仍然存在。

我要做的是还原所有更改,并从this SO answer添加了AddSecondIdentity。创建了StaffUser : IdentityUserStaffUserManager<StaffUser, UserRole>(与原始UserRole相同的UserManager)来处理这些新的IdentityUser对象。

然后我只使用StaffUserManager中的SignInManager<StaffUser>AppUserManager而不是SignInManager<User>Login.cshtml.cs

public LoginModel(StaffUserManager userManager, SignInManager<Models.StaffUser> signInManager, Data.AppDataContext context)
{
    var users = context.Users.ToList() // 1 user
}

这让我进一步感到困惑。但是我现在没有时间。我认为这与数据库的Discriminator部分有关,因为返回的用户是具有StaffUser鉴别符值的用户,但是还有一些没有鉴别符的用户未返回。

1 个答案:

答案 0 :(得分:0)

确保添加服务。AddIdentity

 services
                    .AddIdentity<User, ApplicationRole>(options =>
                    {
                        options.Password.RequireDigit = false;
                        options.Password.RequiredLength = 4;
                        options.Password.RequireLowercase = false;
                        options.Password.RequireNonAlphanumeric = false;
                        options.Password.RequireUppercase = false;

                        //lock out attempt
                        options.Lockout.AllowedForNewUsers = true;
                        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
                        options.Lockout.MaxFailedAccessAttempts = 3;
                    })
                    .AddEntityFrameworkStores<ApplicationDbContext>()
                    .AddDefaultTokenProviders();

如果这不起作用,请向我提供您的源代码,以便我对其进行查看。也许是你的github。