EFCore 数据播种缺少数据插入?

EFCore data seeding missing data insertion?

我有两个相关的类如下:

public class Student
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public long FavoriteCourseId { get; set; }
}

public class Course
{
    public long Id { get; set; }
    public string Name { get; set; }
}

两者之间存在一对一的关系。 Student 有一个通过 FavoriteCourseId.

引用 Course 的外键

我的fluent映射如下:

protected override void OnModelCreating(ModelBuilder modelBuilder) {
  modelBuilder.Entity<Student>(entity => {
    entity.ToTable("Student").HasKey(k => k.Id);
    entity.Property(p => p.Id).HasColumnName("StudentID");
    entity.Property(p => p.Name).IsRequired();
    entity.Property(p => p.Email).IsRequired();
    entity.Property(p => p.FavoriteCourseId).IsRequired();
  });

  modelBuilder.Entity<Course>(entity => {
    entity.ToTable("Course").HasKey(k => k.Id);
    entity.Property(p => p.Id).HasColumnName("CourseID");
    entity.Property(p => p.Name).IsRequired();
  });

  modelBuilder.Entity<Student>()
            .HasOne(typeof(Course))
            .WithOne()
            .HasForeignKey("Student", "FavoriteCourseId")
            .HasConstraintName("FK_Student_Course");

  modelBuilder.Entity<Course>().HasData(
            new Course { Id = 1, Name = "Calculus" },
            new Course { Id = 2, Name = "Chemistry" },
            new Course { Id = 3, Name = "Literature" },
            new Course { Id = 4, Name = "Trigonometry" },
            new Course { Id = 5, Name = "Microeconomics" });

  modelBuilder.Entity<Student>().HasData(
     new Student { Id = 1, Name = "Alice", Email = "alice@gmail.com", FavoriteCourseId = 2 },
     new Student { Id = 2, Name = "Bob", Email = "bob@outlook.com", FavoriteCourseId = 2 });
}

在这里,我正在播种两个学生 - Alice 和 Bob。但是,当我创建 init 迁移时,迁移只会为 Bob 播种而忽略 Alice。

migrationBuilder.InsertData(
            table: "Student",
            columns: new[] { "StudentID", "Email", "FavoriteCourseId", "Name" },
            values: new object[] { 2L, "bob@outlook.com", 2L, "Bob" });

为什么 Alice 的数据行被忽略了?我还注意到,只有当 FavoriteCourseId 对于 Alice 和 Bob 相同时,数据行才会被忽略。如果我将两行的 FavoriteCourseId 更改为不同的值,则会插入 Alice。

它只为一名学生提供种子,因为根据您的模型,同一门课程只能有一名学生。将模型更改为:

public class Student
{
   [Key]
    public long Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public long FavoriteCourseId { get; set; }
    [ForeignKey(nameof(FavoriteCourseId ))]
     [InverseProperty("FavoriteCourses")]
      public virtual Course FavoriteCourse { get; set; }
}

public class Course
{
    [Key]
    public long Id { get; set; }
    public string Name { get; set; }
    [InverseProperty(nameof(Student.FavoriteCourse))]
    public virtual ICollection<Student> Students{ get; set; }
}

和数据库上下文:

modelBuilder.Entity<Student>(entity =>
{
 entity.HasOne(d => d.FavoriteCourse)
 .WithMany(p => p.Courses)
 .HasForeignKey(d => d.FavoriteCourseId)
  .OnDelete(DeleteBehavior.ClientSetNull);
}

modelBuilder.Entity<Course>().HasData(
            new Course { Id = 1, Name = "Calculus" },
            new Course { Id = 2, Name = "Chemistry" },
            new Course { Id = 3, Name = "Literature" },
            new Course { Id = 4, Name = "Trigonometry" },
            new Course { Id = 5, Name = "Microeconomics" });

  modelBuilder.Entity<Student>().HasData(
     new Student { Id = 1, Name = "Alice", Email = "alice@gmail.com", FavoriteCourseId = 2 },
     new Student { Id = 2, Name = "Bob", Email = "bob@outlook.com", FavoriteCourseId = 2 });