2016-12-31 147 views
1

我比较新的Entity Framework(代码优先)。这里是我的两个实体 -INSERT语句与FOREIGN KEY约束冲突

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; } 
} 

员工与出勤有一对多的关系。

我试图数据 -

var attendance = new Attendance() 
        { EmployeeId = 1, 
        CheckinDateTime = today.CurrentDateTime 
        }; 
DbContext.Attendances.Add(attendance); 
DbContext.SaveChanges(); //Exception here. 

我在数据库中的员工记录创建一个新的考勤。

为什么我得到异常?

回答

1

Code First使您能够使用C#或Visual Basic .NET类来描述模型。模型的基本形状通过使用约定来检测。约定是用于在使用Code First时自动配置基于类定义的概念模型的一组规则。这些约定在System.Data.Entity.ModelConfiguration.Conventions命名空间中定义。 您可以使用数据注释或流利的API进一步配置您的模型。优先考虑通过流利的API进行配置,然后是数据注释和惯例。有关更多信息,请参阅数据注释,流利API - 关系,流利API - 类型&使用VB.NET的属性和流利API。

这里你可以找到更多关于Entity Framework Code First Conventions

您设置错误的ID名称为FK和PK,你需要添加主键Attendance也遵循代码优先约定名称,更改模型,如:

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; } 
} 

ForeignKey属性应用于考勤导航属性以指定考勤属性的外键属性名称。

如果没有DataAnnotation,我们可以使用Fluent API来配置我们的关系。 Ofcourse您需要使用代码的第一次大会名称

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 

} 

如果模型没有包含会议名称,可以使用流利的API可以使用.HasForeignKey(),并设置具体名称FK

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); 
} 
相关问题