Entity Framework Core: как сопоставить разные экземпляры объекта одному и тому же объекту? - PullRequest
0 голосов
/ 05 февраля 2020

Как я могу отобразить разные экземпляры объекта сущности в одну и ту же строку в таблицу данных с использованием Entity Framework Core?

Другими словами, как Entity Framework Core сравнивает сущности, которые еще не вставлены в базу данных (в противном случае я предполагаю, что нужно только сравнить первичный ключ) и выясняет, что два объекта должны быть сопоставлены одному юридическое лицо? Сравнивает ли он ссылки на экземпляры? Или вызвать оператор равенства по умолчанию?

Подводя итог моей проблеме, давайте представим, что у меня есть школа, в которой есть ученики и учителя, и что я хочу, чтобы для каждого имени учителя была создана одна строка данных, но я не могу повторно использовать один и тот же экземпляр учителя, как я могу сказать EF: сделай это?

public class Student
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public Teacher Teacher { get; set; }
}

public class Teacher
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }
}

public class SchoolContext : DbContext
{
    public DbSet<Teacher> Teachers { get; set; }
    public DbSet<Student> Students { get; set; }
}

public class SchoolGenerator
{
    public static void CreateASchool(SchoolContext context)
    {
        List<Student> students = new List<Student>()
        {
            new Student(){Name = "Student 1", Teacher = new Teacher(){Name = "Teacher 1"}},
            new Student(){Name = "Student 2", Teacher = new Teacher(){Name = "Teacher 1"}}, // I cannot re-use the previous instance of Teacher 1 for this student
            new Student(){Name = "Student 3", Teacher = new Teacher(){Name = "Teacher 2"}},
            new Student(){Name = "Student 4", Teacher = new Teacher(){Name = "Teacher 2"}},
        };

        context.Students.AddRange(students);
        context.SaveChanges(); // I want to create only TWO teacher rows, one by name, and FOUR student rows
    }
}

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Простой:

var teacher1 = ...;
var teacher2 = ...;

List<Student> students = new List<Student>()
    {
        new Student(){Name = "Student 1", Teacher = teacher1 },
        new Student(){Name = "Student 2", Teacher = teacher1 },
        new Student(){Name = "Student 3", Teacher = teacher2 },
        new Student(){Name = "Student 4", Teacher = teacher2 },
    };

context.Students.AddRange(teacher1, teacher2);
context.Students.AddRange(students);

context.SaveChanges();

Предполагается, что учителя созданы в другом месте и сохранены в той же единице работы, что и студенты.

0 голосов
/ 06 февраля 2020

Почему вы кодировали DbContext вручную? Вместо этого используйте Scaffold-DbContext.

1) Перепроектируйте вашу таблицу Student, добавив новый столбец «TeacherID» в SQL Сервер

2) Создайте связь между таблицами Student и Teacher в SQL Сервер

3) Запустите Scaffold-DbContext для обновления DbContext и сущностей

4) Используйте код ниже

var teacher1 = new Teacher(){ Name = "Teacher 1" };
var teacher2 = new Teacher(){ Name = "Teacher 2" };

context.Teachers.AddRange(teacher1, teacher2);

List<Student> students = new List<Student>()
    {
        new Student(){Name = "Student 1", TeacherID = teacher1.ID },
        new Student(){Name = "Student 2", TeacherID = teacher1.ID },
        new Student(){Name = "Student 3", TeacherID = teacher2.ID },
        new Student(){Name = "Student 4", TeacherID = teacher2.ID }
    };

context.Students.AddRange(students);
context.SaveChanges();

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...