实体框架核心:如何将不同的对象实例映射到同一实体?

时间:2020-02-05 17:22:36

标签: c# entity-framework-core

如何使用Entity Framework Core将实体的不同对象实例映射到同一行的数据表中?

换句话说,Entity Framework Core如何比较尚未插入数据库的实体(否则,我猜它只需要比较主键),并指出应该将两个对象映射到单个实体?它是否比较实例引用?还是调用默认的Equality运算符?

总结一下我的问题,假设我有一所学校,里面有学生和老师,并且我想为每个老师的名字创建一个数据行,但是我不能重用同一老师实例,我该如何告诉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 个答案:

答案 0 :(得分:1)

简单:

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

这假设教师是在其他地方创建的,并且与学生保存在相同的工作单元中。

答案 1 :(得分:-2)

为什么要手动编码DbContext?请改用Scaffold-DbContext。

1)通过在SQL Server中添加新的“ TeacherID”列来重新设计Student表

2)在SQL Server中创建Student和Teacher表之间的关系

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

相关问题