DataContext.Users возвращает пустой результат на страницах Razor - PullRequest
0 голосов
/ 25 июня 2018

Привет, у меня проблема с доступом к таблице Users со страницы Razor в ASP.NET Core

Я создал класс AppDataContext, который расширяет IdentityDbContext<Models.User, Models.UserRole, string>

Я могу использовать его с другими классами контроллеров и сервисами без проблем. Но когда я начинаю работать с бритвенными страницами, dataContext.Users всегда возвращает пустое перечисляемое значение. Другие DbSet все еще работают правильно, только Users не работают.

Это также происходит, когда я пытаюсь получить доступ к данным из других служб, таких как UserManager.Users или SigniInManager.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; }
}

Я сделал что-то не так или я что-то упустил?

UPDATE

Проблема ушла как-то сейчас, после того как я сдался и занялся чем-то другим. Но это не решение, так как исходная проблема все еще существует, если я сделал то же самое.

Что я сделал, так это отменил все свои изменения и добавил AddSecondIdentity из этого SO ответа . Созданы StaffUser : IdentityUser и StaffUserManager<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 голосов
/ 25 июня 2018

Убедитесь, что вы добавили услуги. 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.

...