如何解决EFCore 数据播种缺失数据插入?
我有两个相关的类如下:
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 = "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 的数据行被忽略了?我还注意到只有当 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; }
}
和 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 });
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。