C# 无法在ASP.NET核心代码优先EF模型中将Id设置为主键
这是我的模型课:C# 无法在ASP.NET核心代码优先EF模型中将Id设置为主键,c#,entity-framework,asp.net-core,ef-code-first,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 virt
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; }
}
public类用户角色:IdentityUserRole
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
public int RoleId{get;set;}
public int UserId{get;set;}
公共虚拟角色{get;set;}
公共虚拟用户用户{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类用户角色:IdentityUserRole
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
公共重写int RoleId{get;set;}
公共重写int UserId{get;set;}
[ForeignKey(“RoleId”)]//指定ForeignKey列名
公共虚拟角色{get;set;}
[ForeignKey(“UserId”)]//指定ForeignKey列名
公共虚拟用户用户{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; }
}
public类用户角色:IdentityUserRole
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[ForeignKey(“Role”)]//在属性上指定表名
公共重写int RoleId{get;set;}
[ForeignKey(“用户”)]//在属性上指定表名
公共重写int UserId{get;set;}
公共虚拟角色{get;set;}
公共虚拟用户用户{get;set;}
}
我认为对于用户角色
实体,键应该是这样组合的:
public class UserRole : IdentityUserRole<int>
{
public virtual User User { get; set; }
public virtual Role Role { get; set; }
}
下面是包含所有自定义继承实体(包括
IdentityUserRole
)的 为什么在您的模型类public int Id{get;set;}public int RoleId{get;set;}public int UserId{get;set;}中再次需要这些属性?@SonalBorkar我删除了它们,但仍然创建了userid1
和roleid1
,您可能需要使用它从PM控制台运行更新数据库,但在数据库中,它创建了userid1和roleid1,在从模型UserRole classEntity中删除属性后再次运行它以删除列=>更新数据库默认情况下,框架可以将角色
映射到RoleId
。如果在需要属性之前遵循外键.override关键字的EntityId
约定,则无需明确说明。它会显示以下错误:具有外键属性{'RoleId':int}的'UserRole.Role'到'Role.Users'之间的关系不能以主键{'Id':int}为目标因为它不兼容。为此关系配置一个主键或一组兼容的外键属性。PM>
仍然存在此问题确保已从数据库中删除以前的迁移
userRole.HasKey(r => new
{
r.UserId,
r.RoleId
});