Entity framework core EFCore数据播种缺少数据插入?

Entity framework core EFCore数据播种缺少数据插入?,entity-framework-core,database-migration,ef-core-3.1,seeding,Entity Framework Core,Database Migration,Ef Core 3.1,Seeding,我有两个相关的课程,如下所示: 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 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; }
}
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 });
}
两者之间存在一对一的关系
Student
有一个外键,通过
FavoriteCourseId
引用
课程

我的fluent映射如下所示:

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; }
}
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的数据行?我还注意到,只有当Alice和Bob的
FavoriteCourseId
相同时,数据行才会被忽略。如果我将两行的
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; }
}

公共班级学生
{
[关键]
公共长Id{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
公共长收藏夹CourseId{get;set;}
[ForeignKey(姓名(FavoriteCourseId))]
[反向属性(“偏好课程”)]
公共虚拟课程收藏夹课程{get;set;}
}
公共课
{
[关键]
公共长Id{get;set;}
公共字符串名称{get;set;}
[InverseProperty(姓名(学生最喜欢的课程))]
公共虚拟ICollection学生{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 = "alice@gmail.com", FavoriteCourseId = 2 },
     new Student { Id = 2, Name = "Bob", Email = "bob@outlook.com", FavoriteCourseId = 2 });

modelBuilder.Entity(Entity=>
{
entity.HasOne(d=>d.FavoriteCourse)
.有许多(p=>p.课程)
.HasForeignKey(d=>d.FavoriteCourseId)
.OnDelete(DeleteBehavior.ClientSetNull);
}
modelBuilder.Entity().HasData(
新课程{Id=1,Name=“演算”},
新课程{Id=2,Name=“Chemistry”},
新课程{Id=3,Name=“文学”},
新课程{Id=4,Name=“Trigonology”},
新课程{Id=5,Name=“微观经济学”});
modelBuilder.Entity().HasData(
新学生{Id=1,Name=“Alice”,Email=”alice@gmail.com,FavoriteCourseId=2},
新学生{Id=2,Name=“Bob”,Email=”bob@outlook.com“,FavoriteCourseId=2});

是的,现在我明白了。