2016-12-31 8 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

Код 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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^