Entity framework INSERT语句与外键约束冲突

Entity framework INSERT语句与外键约束冲突,entity-framework,ef-code-first,Entity Framework,Ef Code First,我对实体框架(代码优先)相当陌生。这是我的两个实体- public class Employee { public Employee() { } public long Id {get; set;} public string Fullname {get; set;} public virtual ICollection<Attendance> Attendances { get; set; } } public class Attendanc

我对实体框架(代码优先)相当陌生。这是我的两个实体-

public class Employee
{
    public Employee() { }

    public long Id {get; set;}
    public string Fullname {get; set;}

    public virtual ICollection<Attendance> Attendances { get; set; }
}


public class Attendance
{
    public Attendance() { }
    public DateTime CheckinDateTime { get; set; }
    public DateTime? CheckoutDateTime { get; set; }

    public long EmployeeId { get; set; }

    [ForeignKey("Id")]
    public virtual Employee Employee{ get; set; }
}
我在数据库中有一个员工记录

为什么我会有例外

代码优先使您能够使用C#或Visual Basic.NET类来描述模型。使用约定检测模型的基本形状。约定是一组规则,用于在首先使用代码时根据类定义自动配置概念模型。约定在System.Data.Entity.ModelConfiguration.conventions命名空间中定义。 您可以使用数据注释或fluent API进一步配置模型。优先权通过fluent API分配给配置,然后是数据注释和约定。有关更多信息,请参见数据注释、Fluent API-关系、Fluent API-类型和属性以及Fluent API with VB.NET

在这里你可以找到更多关于

您将错误的ID名称设置为FK和PK,您还需要为
考勤添加主键
,遵循代码优先约定名称,更改您的型号,如:

public class Employee
{
    public Employee()
    {
        Attendances = new List<Attendance>();
    }
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long EmployeeId { get; set; }
    public string Fullname { get; set; }

    public virtual ICollection<Attendance> Attendances { get; set; }
}


public class Attendance
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long AttendanceId { get; set; }
    public DateTime CheckinDateTime { get; set; }
    public DateTime? CheckoutDateTime { get; set; }
    [Required]
    [ForeignKey("Employee")]
    public long EmployeeId { get; set; }

    public virtual Employee Employee { get; set; }
}

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//一对多
modelBuilder.Entity()
.HasRequired(e=>e.Employee)
.人数众多(a=>a.出席人数)
.HasForeignKey(e=>e.EmpId);
}
public class Employee
{
    public Employee()
    {
        Attendances = new List<Attendance>();
    }
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long EmployeeId { get; set; }
    public string Fullname { get; set; }

    public virtual ICollection<Attendance> Attendances { get; set; }
}


public class Attendance
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long AttendanceId { get; set; }
    public DateTime CheckinDateTime { get; set; }
    public DateTime? CheckoutDateTime { get; set; }
    [Required]
    [ForeignKey("Employee")]
    public long EmployeeId { get; set; }

    public virtual Employee Employee { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //one-to-many 
    modelBuilder.Entity<Attendance>()
                .HasRequired<Employee>(e => e.Employee) // Attendance entity requires Employee 
                .WithMany(a => a.Attendances); // Employee entity includes many Attendances entities

}
public class Attendance
{

    public long AttendanceId { get; set; }
    public DateTime CheckinDateTime { get; set; }
    public DateTime? CheckoutDateTime { get; set; }

    //Not first code convention name
    public long EmpId { get; set; }

    public virtual Employee Employee { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //one-to-many 
    modelBuilder.Entity<Attendance>()
                .HasRequired<Employee>(e => e.Employee)
                .WithMany(a => a.Attendances)
                .HasForeignKey(e => e.EmpId);
}