我在尝试替换ASP.NET Core Identity(在2.0更新中为breaking change)中的IdentityUser导航属性时遇到问题。

我查看了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);


进行迁移,您就完成了。

10-08 19:03