在 ASP.NET 核心 2.0 中更新身份
Updating Identity in ASP.NET Core 2.0
我在尝试替换 ASP.NET Core Identity 中的 IdentityUser 导航属性时遇到问题,这是 2.0 更新中的 breaking change。
我查看了 Add IdentityUser POCO Navigation Properties,但几乎没有关于如何实际执行此操作的解释。
在 ApplicationUser.cs 我添加了以下内容:
public virtual ICollection<IdentityUserRole<string>> Roles
{ get; } = List<IdentityUserRole<string>>();
但是当我尝试使用该导航时 属性 它使用了 ApplicationUserId 而不是 UserId。
欢迎提出任何建议,因为这不直观,希望身份识别团队可以在文档中进一步阐述。
在我的例子中,我有三个派生类 ApplicationUserClaim、ApplicationUserLogin、ApplicationUserRole。我这样做是因为我需要添加一些自定义属性。
未添加属性的派生 类 应如下所示。
public class ApplicationUserLogin : IdentityUserLogin<string>
{
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ApplicationUserRole: IdentityUserRole<string>
{
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ApplicationUserClaim: IdentityUserClaim<string>
{
public virtual ApplicationUser ApplicationUser { get; set; }
}
在您的 ApplicationUser 上添加以下代码:
public virtual ICollection<ApplicationUserRole> Roles { get; } = new List<ApplicationUserRole>();
public virtual ICollection<ApplicationUserClaim> Claims { get; } = new List<ApplicationUserClaim>();
public virtual ICollection<ApplicationUserLogin> Logins { get; } = new List<ApplicationUserLogin>();
在您的 ApplicationDbContext 中添加以下代码:
modelBuilder.Entity<ApplicationUserClaim>().HasOne(pt => pt.ApplicationUser).WithMany(t => t.Claims).HasForeignKey(pt => pt.UserId);
modelBuilder.Entity<ApplicationUserRole>().HasOne(pt => pt.ApplicationUser).WithMany(t => t.Roles).HasForeignKey(pt => pt.UserId);
modelBuilder.Entity<ApplicationUserLogin>().HasOne(pt => pt.ApplicationUser).WithMany(t => t.Logins).HasForeignKey(pt => pt.UserId);
进行迁移,您就完成了。
将以下内容添加到 ApplicationDbContext.cs 中的 OnModelCreating 解决了我从 GitHub 问题 How to include Roles in IdentityUser?
中发现的问题
builder.Entity<ApplicationUser>().HasMany(p => p.Roles)
.WithOne().HasForeignKey(ur => ur.UserId).IsRequired();
我在尝试替换 ASP.NET Core Identity 中的 IdentityUser 导航属性时遇到问题,这是 2.0 更新中的 breaking change。
我查看了 Add IdentityUser POCO Navigation Properties,但几乎没有关于如何实际执行此操作的解释。
在 ApplicationUser.cs 我添加了以下内容:
public virtual ICollection<IdentityUserRole<string>> Roles
{ get; } = List<IdentityUserRole<string>>();
但是当我尝试使用该导航时 属性 它使用了 ApplicationUserId 而不是 UserId。
欢迎提出任何建议,因为这不直观,希望身份识别团队可以在文档中进一步阐述。
在我的例子中,我有三个派生类 ApplicationUserClaim、ApplicationUserLogin、ApplicationUserRole。我这样做是因为我需要添加一些自定义属性。
未添加属性的派生 类 应如下所示。
public class ApplicationUserLogin : IdentityUserLogin<string>
{
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ApplicationUserRole: IdentityUserRole<string>
{
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ApplicationUserClaim: IdentityUserClaim<string>
{
public virtual ApplicationUser ApplicationUser { get; set; }
}
在您的 ApplicationUser 上添加以下代码:
public virtual ICollection<ApplicationUserRole> Roles { get; } = new List<ApplicationUserRole>();
public virtual ICollection<ApplicationUserClaim> Claims { get; } = new List<ApplicationUserClaim>();
public virtual ICollection<ApplicationUserLogin> Logins { get; } = new List<ApplicationUserLogin>();
在您的 ApplicationDbContext 中添加以下代码:
modelBuilder.Entity<ApplicationUserClaim>().HasOne(pt => pt.ApplicationUser).WithMany(t => t.Claims).HasForeignKey(pt => pt.UserId);
modelBuilder.Entity<ApplicationUserRole>().HasOne(pt => pt.ApplicationUser).WithMany(t => t.Roles).HasForeignKey(pt => pt.UserId);
modelBuilder.Entity<ApplicationUserLogin>().HasOne(pt => pt.ApplicationUser).WithMany(t => t.Logins).HasForeignKey(pt => pt.UserId);
进行迁移,您就完成了。
将以下内容添加到 ApplicationDbContext.cs 中的 OnModelCreating 解决了我从 GitHub 问题 How to include Roles in IdentityUser?
中发现的问题builder.Entity<ApplicationUser>().HasMany(p => p.Roles)
.WithOne().HasForeignKey(ur => ur.UserId).IsRequired();