我已经创建了一个包含所有以 Guid 作为主键的身份表的数据上下文,但迁移后的 IdentityUserClaim 和 IdentityRoleClaim 表仍然以 int 作为主键。有什么办法可以将其更改为 Guid 作为主键
public class DataContext: IdentityDbContext<IdentityUser<Guid>, IdentityRole<Guid>, Guid, IdentityUserClaim<Guid>, IdentityUserRole<Guid>, IdentityUserLogin<Guid>, IdentityRoleClaim<Guid>, IdentityUserToken<Guid>>
{
public DataContext(DbContextOptions<DataContext> options): base(options)
{
}
}
自定义身份模型 说:
IdentityUserClaim 的 TKey 是为 PK 指定的类型 用户数。在本例中,TKey 是字符串,因为默认值是 用过的。它不是 UserClaim 实体类型的 PK 类型。
IdentityUserClaim 类如下所示:
public class IdentityUserClaim<TKey> where TKey : IEquatable<TKey>
{
public virtual int Id { get; set; }
public virtual TKey UserId { get; set; }
public virtual string ClaimValue { get; set; }
public virtual void InitializeFromClaim(Claim claim);
public virtual Claim ToClaim();
}
可以使用 EF Core 对身份表非主键字段(例如 IdentityUser 的自定义身份用户表)应用更新迁移。但是,对于 ASP.NET Core Identity 用户、角色、声明表上的新主键类型,您无法应用 EF Core 更新支架。
建议完全删除并重新创建。
应用以下内容:
修改数据库上下文类(已经完成)。
在启动配置服务中添加以下内容以使用通用用户:
services.AddIdentity
从上下文重新创建数据库表。这可以使用以下方法完成:
context.Database.EnsureCreated();
在启动配置()中。
无法更新
IdentityUserClaim
和 IdentityRoleClaim
表的主键类型。库内部实现依赖于 Id
列作为整数。
我想出于更安全的原因,您更喜欢 Guid 而不是 Int。但是,请记住,这些 id 是内部的,不应暴露在服务器外部,因此可以将它们设置为整数。
当然,建议像您一样将
UserId
和 RoleId
从 string
更改为 Guid
。与 RoleClaims
和 UserClaims
表相反,这些表暴露给客户端,因此,强烈建议它们使用 Guid 主键而不是整数。