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