Entity Framework 6 кодирует первый свободный API-интерфейс один на один с обоими необходимыми концами - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу реализовать отношение «один к одному» с обоими сторонами, необходимыми для свободного API в коде Entity Framework 6. Сначала 1001 *

У меня есть основной класс:

public class Student
{
    public int Id{ get;  set;} 
    public string Name{ get;  set;}
    public StudentProfile StudentProfile { get; set; } 
}

и у меня есть зависимый класс:

public class StudentProfile
{
    public int Id{ get;  set;} 
    public string Description{ get;  set;}
    public Student Student { get; set; } 
}

Кроме того, у меня есть конфигурация для отношения один к одному, в этом случае ТРЕБУЕТСЯ оба конца:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
            .HasRequired(student => student.StudentProfile)
            .WithRequiredPrincipal(profile => profile.Student);

     base.OnModelCreating(modelBuilder);   
}

После выполнения update-database получаемые сгенерированные таблицы будут:

enter image description here

Стол столбцов StudentProfile:

enter image description here

Таблица Столбцы студентов:

enter image description here

В основной программе я могу сохранить студента с его профилем:

 UMLModel umlContext = new UMLModel();

 //Studentprofile object
 StudentProfile studentProfile = new StudentProfile();
 studentProfile.Description = "Emily Profile Description";

 //Student object
 Student student = new Student();
 student.Name = "Emily";
 student.StudentProfile = studentProfile;

 //Save Student and StudenProfile Objects
 umlContext.Students.Add(student);
 umlContext.SaveChanges();

После выполнения основной программы в базе данных таблица StudentProfiles:

enter image description here

и таблица учеников:

enter image description here

Проблема возникает, когда я пытаюсь сохранить одного студента БЕЗ его профиля, программа позволяет сохранить его, и предполагается, что он не позволяет:

UMLModel umlContext = new UMLModel();

Student student = new Student();
student.Name = "John";

umlContext.Students.Add(student);  
umlContext.SaveChanges();

После выполнения основной программы в базе данных для таблицы StudentProfiles теперь есть:

enter image description here

и для стола. Студенты:

enter image description here

Одним из способов предотвратить это является использование аннотаций данных, но мне не нравится этот подход, поскольку классам домена требуется дополнительный код:

public class Student
{
    public int Id{ get;  set;} 
    public string Name{ get;  set;}
    [Required]
    public virtual StudentProfile StudentProfile { get; set; } 
}

Вопросы:

  1. Это ошибка в свободном API?
  2. Есть ли способ решить эту проблему с помощью Fluent API без изменения классы доменов?

Заранее спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

Возможно, посмотрите здесь ответ о переполнении стека, который дает хорошее объяснение о сопоставлениях 1: 1 в Entity Framework и некоторых вариантах того, как вы можете отобразить их так, чтобы оба конца были необходимы: https://stackoverflow.com/a/30516623/2128831

...