无法在 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
无法设置主键,它会在数据库中创建额外的列 UserId1
和 RoleId1
。有什么问题?我该如何解决?
根据默认约定,当其名称与相关实体的主键 属性 匹配时,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
。
这是我的模型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
无法设置主键,它会在数据库中创建额外的列 UserId1
和 RoleId1
。有什么问题?我该如何解决?
根据默认约定,当其名称与相关实体的主键 属性 匹配时,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
。