C# EntityFramework代码第一个Insert语句与外键约束冲突
我已经阅读了每一个涉及代码优先外键约束错误的问题,并与一些人讨论了它,但我仍然完全不理解这个错误。我不明白为什么我在尝试处理各种应用程序中的外键时经常看到这种情况。人们试图解释这个问题,我的眼睛都呆呆了 我的个人模型中有:C# EntityFramework代码第一个Insert语句与外键约束冲突,c#,entity-framework,asp.net-core-mvc,code-first,C#,Entity Framework,Asp.net Core Mvc,Code First,我已经阅读了每一个涉及代码优先外键约束错误的问题,并与一些人讨论了它,但我仍然完全不理解这个错误。我不明白为什么我在尝试处理各种应用程序中的外键时经常看到这种情况。人们试图解释这个问题,我的眼睛都呆呆了 我的个人模型中有: [Required(ErrorMessage = "Role required.")] [Display(Name = "Role")] [ForeignKey("roles")] public string RoleId { get; set; } public virt
[Required(ErrorMessage = "Role required.")]
[Display(Name = "Role")]
[ForeignKey("roles")]
public string RoleId { get; set; }
public virtual IdentityRole roles { get; set; }
当新用户注册时,我在AccountController中执行此操作:
string roleid = user.Roles.FirstOrDefault().RoleId;
NewUserToolContext ctx = new NewUserToolContext();
Person person = new Person { FirstName = model.FirstName, LastName = model.LastName, Email = model.Email, RoleId = roleid };
ctx.people.Add(person);
ctx.SaveChanges();
为什么每次我尝试使用外键时都会出现同样的错误?使用外键不好吗?我已经调试、检查并验证了在创建新的“Person”时,正确的ID正在传递给model属性
以下是全人模式:
public class Person
{
[Key]
public int PersonId { get; set; }
[Required(ErrorMessage = "First name required.")]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Required(ErrorMessage = "Last name required.")]
[Display(Name = "Last Name")]
public string LastName { get; set; }
[Required(ErrorMessage = "Email required.")]
[Display(Name = "Email")]
public string Email { get; set; }
[Required(ErrorMessage = "Role required.")]
[Display(Name = "Role")]
[ForeignKey("roles")]
public string RoleId { get; set; }
public virtual IdentityRole roles { get; set; }
}
错误消息:
INSERT语句与外键约束“FK_dbo.Person_dbo.IdentityRole_RoleId”冲突。冲突发生在数据库“NEWUSERTOOL_7c54952102864024ab864e4bab34f694”表“dbo.IdentityRole”列“Id”中。
声明已终止
有关更多信息,请参阅我的应用程序其余部分的上下文:
public class NewUserToolContext : DbContext
{
public DbSet<Location> locations { get; set; }
public DbSet<Country> countries { get; set; }
public DbSet<Department> departments { get; set; }
public DbSet<NewUser> newusers { get; set; }
public DbSet<Person> people { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
}
公共类NewUserToolContext:DbContext
{
公共数据库集位置{get;set;}
公共数据库集国家{get;set;}
公共数据库集部门{get;set;}
公共DbSet newusers{get;set;}
公共数据库集人物{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Conventions.Remove();
modelBuilder.Entity().HasKey(l=>l.UserId);
modelBuilder.Entity().HasKey(r=>r.Id);
modelBuilder.Entity().HasKey(r=>new{r.RoleId,r.UserId});
}
}
1)您试图分配给用户的角色的ID是什么?2) IdentityRole表中是否存在该角色ID?3) 使用探查器捕获发送到数据库的查询,在SSMS中检查它。为什么错了?你能分享人物模型的其余代码吗。你定义了表的主键了吗?我已经检查过了。角色存在。它正在尝试将相同的角色id分配给person模型中的属性。我不知道SSMS或探查器是什么,但在调试时,我可以看到它们是一个相同的ID。使用完整的个人模型进行了更新。您是否在Identity Roles表中设置了外键的另一侧?公共虚拟ICollection人员{get;set;}