Код First позволяет описать модель с использованием классов C# или Visual Basic .NET. Основная форма модели определяется с помощью условных обозначений. Соглашения - это наборы правил, которые используются для автоматической настройки концептуальной модели на основе определений классов при работе с Code First. Соглашения определены в пространстве имен System.Data.Entity.ModelConfiguration.Conventions. Вы можете дополнительно настроить свою модель, используя аннотации данных или свободный API. Приоритет отдается конфигурации через свободный API, за которым следуют аннотации данных, а затем соглашения. Для получения дополнительной информации см. Аннотации данных, Fluent API - Отношения, Свободный API - Типы & Свойства и Свободный API с VB.NET.
Здесь вы найдете больше о Entity Framework Code First Conventions
Вы установили неверное имя IdS, как 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 применяется к свойствам навигации Attendance, чтобы указать имя свойства foreignkey для свойства Attendance.
Без 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
}
Если ваша модель не содержит имя конвенции, с помощью Fluent 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);
}