System.Data.SqlClient.SqlException:INSERT语句与FOREIGN KEY约束“FK_dbo.employee_entity_dbo.person_entity_id”冲突 . 冲突发生在数据库“EFEmployeeEntityModelContext”,表“dbo.person_entity”,列“id”中 .
因此,当我尝试插入员工实体时,我收到此错误,但我不确定原因 . 我还有一个人实体类,它与雇员实体有一对一或零关系 . 所以每个员工都是一个人,但每个人不一定是员工 . 为了 Build 这种关系,在我的员工实体类中,我有一个PersonID属性 . 因此,此PersonID应该是与person实体的Id主键相关的外键 . 这是我的员工实体类:
[Table("employee_entity")]
public class EFEmployee : EFBusinessEntity
{
[Column("office_id")]
public Guid OfficeID { get; set; }
[Column("person_id")]
//[Index("ix_employee_person_id", IsUnique=true)]
public Guid PersonID { get; set; }
[Column("hire_date")]
public DateTime HireDate { get; set; }
[Column("job_title")]
[Required]
public byte[] JobTitle { get; set; }
[Column("salary")]
public int Salary { get; set; }
[Column("certifications")]
public byte[] Certifications { get; set; }
[Column("vacation_time")]
public int VacationTime { get; set; }
[Column("sick_time")]
public int SickTime { get; set; }
public virtual EFOffice Office { get; set; }
public virtual EFPerson Identity { get; set; }
public virtual EFEmployee ReportingTo { get; set; }
public EFEmployee(Guid id, Guid tenantId, Guid officeID, Guid personID, DateTime hire, byte[] titles, int salary, byte[] certifications, int vacationTime, int sickTime)
{
this.Id = id;
this.TenantId = tenantId;
this.OfficeID = officeID;
this.PersonID = personID;
this.HireDate = hire;
this.JobTitle = titles;
this.Salary = salary;
this.Certifications = certifications;
this.SickTime = sickTime;
this.VacationTime = vacationTime;
}
}
这是Person实体的类:
[Table("person_entity")]
public class EFPerson : EFBusinessEntity
{
[Column("first_name")]
[StringLength(50)]
public string FirstName { get; set; }
[Column("last_name")]
[StringLength(50)]
public string LastName { get; set; }
[Column("phone_num")]
public uint? PhoneNum { get; set; }
[Column("date_of_birth")]
public DateTime DateOfBirth { get; set; }
public virtual EFEmployee Employee { get; set; }
public EFPerson(Guid id, Guid tenantId, string firstName, string lastName, DateTime dob)
{
this.Id = id;
this.TenantId = tenantId;
this.FirstName = firstName;
this.LastName = lastName;
this.DateOfBirth = dob;
}
}
这是基本实体类:
[Table("business_entity")]
public abstract class EFBusinessEntity : IBusinessEntity
{
[Column("tenant_id")]
public Guid TenantId
{
get;
set;
}
[Column("id")]
[Key]
public Guid Id
{
get;
set;
}
}
这是我正在运行的测试用例,它给我插入一个员工的错误:
public void TestInsertEmployee1()
{
InitializeDatabase();
EFEmployee testEmployee = InitializeEmployee1();
EFRepo.Insert<EFEmployee>(testEmployee);
EFEmployee randomEmployee = EFRepo.GetById<EFEmployee>(testEmployee.Id);
Debug.Assert(testEmployee.Equals(randomEmployee));
}
InitializeEmployee1()创建一个测试员工,当我初始化它时,我确保它使用与调用InitializePerson1()时相同的PersonID . 我通过电话确认这一点
Debug.WriteLine(testEmployee.PersonID);
然后我将它与Microsoft SQL Server中person_entity表中的Id的人物进行比较 . 如果两个ID匹配,那么问题是什么?
我还使用流畅的API在数据库上下文类的OnModelCreating方法中进行映射:
modelBuilder.Entity<EFEmployee>().HasRequired(t => t.Office).WithMany(u => u.Employees).HasForeignKey(d => d.OfficeID);
modelBuilder.Entity<EFEmployee>().HasRequired(t => t.Identity).WithOptional(u => u.Employee);