嗨,我在从ASP.NET Core中的Razor页面访问Users表时遇到问题
我创建了一个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; }
}
我做错了什么还是错过了什么?
更新
在我放弃并做其他事情之后,问题现在已经消失了。但这不是解决方案,因为如果我做同样的事情,原来的问题仍然存在。
我要做的是还原所有更改,并从this SO answer添加了AddSecondIdentity
。创建了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
鉴别符值的用户,但是还有一些没有鉴别符的用户未返回。
答案 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。