无法将ID设置为ASP.NET Core代码优先EF模型中的主键

时间:2018-12-29 07:10:31

标签: c# entity-framework asp.net-core ef-code-first

这是我的模型课:

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。有什么问题?我该怎么解决?

2 个答案:

答案 0 :(得分:1)

根据默认约定,当EF的名称与相关实体的主键属性匹配时,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; }
    }

答案 1 :(得分:1)

我认为对于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
                        });

这里是example of configuring custom IdentityDbContext,其中所有自定义继承的实体包括IdentityUserRole