![](/img/trans.png)
[英]ASP.NET Core ApiAuthorizationDbContext not creating table for data model
[英]ASP .NET Core Identity custom ApiAuthorizationDbContext
我正在使用带有 Angular 项目的 ASP .NET Core 3.0。 我看到了这个新的ApiAuthorizationDbContext
,我想覆盖表名和用户 ID(到 int),但我无法做到。 有没有人知道诀窍?
这是用于覆盖表名的上下文的 class,但它会创建AspNetUser
和User
表。 为什么它不像往常一样创建一个?
public class ApplicationDbContext : ApiAuthorizationDbContext<AppUser>
{
public ApplicationDbContext(
DbContextOptions options,
IOptions<OperationalStoreOptions> operationalStoreOptions) : base(options, operationalStoreOptions)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<AppUser>(entity => { entity.ToTable(name: "User"); });
modelBuilder.Entity<AppRole>(entity => { entity.ToTable(name: "Role"); });
}
}
这是我的用户:
public class AppUser : IdentityUser
{
}
通常我用AppUser<int>
覆盖主键,但由于ApiAuthorizationDbContext
它不起作用。
有任何想法吗?
对于使用ApiAuthorizationDbContext
自定义用户和角色表,您可以按照以下步骤操作:
添加用户和角色 Class
public class AppUser: IdentityUser<int> { } public class AppRole: IdentityRole<int> { }
添加自定义ApiAuthorizationDbContext
/// <summary> /// Database abstraction for a combined <see cref="DbContext"/> using ASP.NET Identity and Identity Server. /// </summary> /// <typeparam name="TUser"></typeparam> /// <typeparam name="TRole"></typeparam> /// <typeparam name="TKey">Key of the IdentityUser entity</typeparam> public class KeyApiAuthorizationDbContext<TUser, TRole, TKey>: IdentityDbContext<TUser, TRole, TKey>, IPersistedGrantDbContext where TUser: IdentityUser<TKey> where TRole: IdentityRole<TKey> where TKey: IEquatable<TKey> { private readonly IOptions<OperationalStoreOptions> _operationalStoreOptions; /// <summary> /// Initializes a new instance of <see cref="ApiAuthorizationDbContext{TUser, TRole, TKey}"/>. /// </summary> /// <param name="options">The <see cref="DbContextOptions"/>.</param> /// <param name="operationalStoreOptions">The <see cref="IOptions{OperationalStoreOptions}"/>.</param> public KeyApiAuthorizationDbContext( DbContextOptions options, IOptions<OperationalStoreOptions> operationalStoreOptions): base(options) { _operationalStoreOptions = operationalStoreOptions; } /// <summary> /// Gets or sets the <see cref="DbSet{PersistedGrant}"/>. /// </summary> public DbSet<PersistedGrant> PersistedGrants { get; set; } /// <summary> /// Gets or sets the <see cref="DbSet{DeviceFlowCodes}"/>. /// </summary> public DbSet<DeviceFlowCodes> DeviceFlowCodes { get; set; } Task<int> IPersistedGrantDbContext.SaveChangesAsync() => base.SaveChangesAsync(); /// <inheritdoc /> protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value); } } /// <summary> /// Database abstraction for a combined <see cref="DbContext"/> using ASP.NET Identity and Identity Server. /// </summary> /// <typeparam name="TUser"></typeparam> public class ApiAuthorizationDbContext<TUser>: KeyApiAuthorizationDbContext<TUser, IdentityRole, string> where TUser: IdentityUser { /// <summary> /// Initializes a new instance of <see cref="ApiAuthorizationDbContext{TUser}"/>. /// </summary> /// <param name="options">The <see cref="DbContextOptions"/>.</param> /// <param name="operationalStoreOptions">The <see cref="IOptions{OperationalStoreOptions}"/>.</param> public ApiAuthorizationDbContext( DbContextOptions options, IOptions<OperationalStoreOptions> operationalStoreOptions): base(options, operationalStoreOptions) { } }
更改DbContext
public class ApplicationDbContext: KeyApiAuthorizationDbContext<AppUser, AppRole, int> { public ApplicationDbContext( DbContextOptions options, IOptions<OperationalStoreOptions> operationalStoreOptions): base(options, operationalStoreOptions) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<AppUser>(entity => { entity.ToTable(name: "User"); }); modelBuilder.Entity<AppRole>(entity => { entity.ToTable(name: "Role"); }); } }
注册用户和角色
services.AddDefaultIdentity<AppUser>().AddRoles<AppRole>().AddEntityFrameworkStores<ApplicationDbContext>(); services.AddIdentityServer().AddApiAuthorization<AppUser, ApplicationDbContext>();
删除现有的Migrations
(如果数据库存在,您可能需要将其删除)。
运行 add-migration 和 update-database 以检查结果。
目前,您需要自定义ApiAuthorizationDbContext
,已通过ApiAuthorizationDbContext force TUser 跟踪此问题以扩展 IdentityUser 而不是 IdentityUser #9548并将IdentityUser 支持添加到 ApiAuthorizationDbContext #13064 。 获得新东方版本会有些延迟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.