使用具有一对多关系的ASP.NET Core进行种子设定



我正试图在ASP.NET Core中为我的数据库创建一个种子,但我在处理模型之间的关系时遇到了问题。我有3个模特,有2个关系。我有以下型号:

public enum Grade
{
A, B, C, D, F
}
public class Enrollment
{
public Guid ID { get; set; } = Guid.NewGuid();
public Course Course { get; set; }
public Student Student { get; set; }
public Grade Grade { get; set; }
}
public class Course
{
public Guid ID { get; set; } = Guid.NewGuid();
public string Title { get; set; }
public int Credits { get; set; }
public List<Enrollment>? Enrollments { get; set; }
}
public class Student
{
public Guid ID { get; set; } = Guid.NewGuid();
public string LastName { get; set; }
public string FirstName { get; set; }
public DateTime EnrollmentDate { get; set; } = DateTime.Now;
public List<Enrollment>? Enrollments { get; set; }
}

在我的DBContext上,我尝试创建种子:

List<Student> students = new List<Student>()
{
new Student {FirstName = "Jaimie", LastName = "Vos", EnrollmentDate = DateTime.Now },
new Student {FirstName = "Bas", LastName = "Milius", EnrollmentDate = DateTime.Now },
new Student {FirstName = "Rien", LastName = "Bijl", EnrollmentDate = DateTime.Now },
new Student {FirstName = "Rajeck", LastName = "Massa", EnrollmentDate = DateTime.Now }
};
modelBuilder.Entity<Student>().HasData(students);
List<Course> courses = new List<Course>()
{
new Course {Title = "Wiskunde", Credits = 20},
new Course {Title = "Nederlands", Credits = 15},
new Course {Title = "Frans", Credits = 10},
};
modelBuilder.Entity<Course>().HasData(courses);
Enrollment test = new Enrollment();
test.Grade = Grade.A;
test.Course = courses[0];
test.Student = students[1];
modelBuilder.Entity<Enrollment>().HasData(test);

但当我运行这个时,我得到了错误:

无法添加实体类型"Enrollment"的种子实体,因为没有为所需属性"CourseID"提供值。

我遵循了关系文档,有人知道解决这个问题的方法吗?

我发现您可以创建一个新对象(不指定类型(,并为其提供一个指定相关ID的属性。因此,您应该能够执行以下操作:

modelBuilder.Entity<Course>().HasData(new [] {
new { Title = "Frans", Credits = 10, Id = <courseGUID1> },
new { Title = "Nederlands", Credits = 15, Id = <courseGUID2> }
});
modelBuilder.Entity<Enrollment>().HasData(new [] {
new { Grade = Grade.A, CourseId = <courseGUID1>, StudentId = <studentGUID1> }
});

总之,我讨厌种子数据,但我已经使用了相当多的种子数据,上面的解决方案似乎让我过得去。这不是直观的,如果你的代码有效就好了!

我认为ID应该在创建时生成,但显然这不起作用。

PS:如果使用自动递增的整数ID,我通常只使用负整数,以避免与生成的ID发生冲突。

最新更新