Привет, у меня проблема с доступом к таблице 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
дискриминатора, но есть некоторые другие без дискриминатора, которые не возвращаются.