无法在 ASP.NET 核心代码优先 EF 模型中将 Id 设置为主键

Can not set Id as primary key in ASP.NET Core code-first EF model

这是我的模型class:

public class UserRole : IdentityUserRole<int>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int RoleId { get; set; }
    public int UserId { get; set; }
    public virtual Role Role { get; set; }
    public virtual User User { get; set; }
}

Id 无法设置主键,它会在数据库中创建额外的列 UserId1RoleId1。有什么问题?我该如何解决?

根据默认约定,当其名称与相关实体的主键 属性 匹配时,EF 将 属性 作为外键 属性。 [ForeignKey] 属性覆盖外键的默认约定它允许我们在依赖实体中指定外键 属性,其名称与主体实体的主键 属性 不匹配。

使用下面的代码:-

public class UserRole : IdentityUserRole<int>
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public override int RoleId { get; set; }
    public override int UserId { get; set; }
    [ForeignKey("RoleId")] // Specify ForeignKey Column Name
    public virtual Role Role { get; set; }
    [ForeignKey("UserId")] // Specify ForeignKey Column Name
    public virtual User User { get; set; }
}

或者您可以使用:-

public class UserRole : IdentityUserRole<int>
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [ForeignKey("Role")] // Specify Table name on Property
        public override int RoleId { get; set; }
        [ForeignKey("User")] // Specify Table name on Property
        public override int UserId { get; set; }
        public virtual Role Role { get; set; }
        public virtual User User { get; set; }
    }

我认为 UserRole 实体的键应该像这样复合:

public class UserRole : IdentityUserRole<int>
{
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}

配置如下:

userRole.HasKey(r => new
                        {
                            r.UserId,
                            r.RoleId
                        });

这里是 ,其中包含所有自定义继承的实体,包括 IdentityUserRole