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 });
我有两个相关的类如下:
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 });