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

Navjot Singh |

我有两个相关的类,如下所示:

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有一个外键,它Course通过引用FavoriteCourseId

我的流利映射如下:

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 = "[email protected]", FavoriteCourseId = 2 },
     new Student { Id = 2, Name = "Bob", Email = "[email protected]", FavoriteCourseId = 2 });
}

在这里,我正在播种两个学生-爱丽丝和鲍勃。但是,当我创建初始化迁移时,该迁移仅播种Bob并忽略Alice。

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

为什么会忽略Alice的数据行?我还注意到,只有当FavoriteCourseIdAlice和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; }
}

和dbcontext:

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 = "[email protected]", FavoriteCourseId = 2 },
     new Student { Id = 2, Name = "Bob", Email = "[email protected]", FavoriteCourseId = 2 });

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章