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});
是的,现在我明白了。