【问题标题】:DataContext.Users returns empty result in Razor pagesDataContext.Users 在 Razor 页面中返回空结果
【发布时间】:2018-06-25 05:26:22
【问题描述】:

您好,我在从 ASP.NET Core 中的 Razor 页面访问用户表时遇到问题

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

我可以毫无问题地将它与其他控制器类和服务一起使用。但是当我开始处理剃须刀页面时,dataContext.Users 总是返回空的可枚举。其他DbSets 仍然可以正常工作,只有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&lt;StaffUser, UserRole&gt;(与原始UserRole 相同的UserManager)来处理这些新的IdentityUser 对象。

然后我只使用StaffUserManagerSignInManager&lt;StaffUser&gt; 而不是Login.cshtml.cs 中的AppUserManagerSignInManager&lt;User&gt;

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

这让我更加困惑。但我现在没有时间做这个。我认为这与数据库的Discriminator 部分有关,因为返回的用户是具有StaffUser 鉴别器值的用户,但还有一些没有鉴别器的其他用户没有返回。

【问题讨论】:

  • 我可以看看你的用户类。您想将 User 类与 IdentityUser 一起使用吗?如果是这样,请查看我的代码github.com/Awesome-CMS-Core/Awesome-CMS-Core/blob/master/src/…
  • @NgôHùngPhúc 我在原帖中添加了我的User 课程。是的,它源自IdentityUser
  • 这个问题你解决了吗
  • 我解决了我的问题,如更新部分所述。但是解决方案与原始问题无关。所以我认为我还没有解决原来的问题。

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


【解决方案1】:

确保添加 services.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。

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 2014-05-06
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2020-07-11
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多