我有以下简单模型,它正在Code First方法中实现。部门和课程有一对多的关系。一个部门可以有很多课程,而一个课程可以只属于一个部门。这是模型。
public class Department
{
public int DepartmentId { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int DepartmentId { get; set; }
public virtual Department Department { get; set; }
}
我的问题是我想种下它们。我想在Seed函数中至少有5个值。这是种子功能。
public class DataInitializer : DropCreateDatabaseIfModelChanges<StudentRecordContext>
{
protected override void Seed(StudentRecordContext context)
{
var departments = new List<Department>
{
new Department { DepartmentId = 1, Title = "English", Description ="English Department", Courses = new List<Course>() },
new Department { DepartmentId= 2,Title = "Chemistry", Description ="chemistry department", Courses = new List<Course>() },
new Department { DepartmentId= 3,Title = "Mahematics", Description ="mathematics department", Courses = new List<Course>() },
new Department { DepartmentId= 4,Title = "Philosophy", Description ="philosophy department", Courses = new List<Course>() },
new Department { DepartmentId= 5,Title = "Biology", Description ="biology department", Courses = new List<Course>() }
};
departments.ForEach( t => context.Departments.Add(t));
context.SaveChanges();
var courses = new List<Course>
{
new Course { CourseId = 1055, Title = "Classic English", Description = "Some Description", DepartmentId = 1 },
new Course { CourseId = 2055, Title = "Applied Chemistry", Description = "Some Description", DepartmentId = 2 },
new Course { CourseId = 2056, Title = "Applied Mathematics", Description = "Some Description", DepartmentId = 3 },
new Course { CourseId = 3041, Title = "MetaPhysics", Description = "Some Description", DepartmentId = 4 },
new Course { CourseId = 3024, Title = "Molecular Biology", Description = "Some Description", DepartmentId = 5 },
};
courses.ForEach(t => context.Courses.Add(t));
context.SaveChanges();
但这不起作用。我是EF和Code First的新手......还有未来的截止日期......任何人都可以帮助我,因为我们正确的方法是播种数据库。
答案 0 :(得分:3)
不要在Seed()
方法中设置主键。实体框架将知道名称中包含Id的属性将是主键。
在Seed()
方法中尝试以下操作:
protected override void Seed(StudentRecordContext context)
{
var departments = new List<Department>
{
// this will have DepartmentId = 1
new Department { Title = "English", Description ="English Department", Courses = new List<Course>() },
// more departments
};
departments.ForEach(d => context.Departments.Add(d));
context.SaveChanges();
var courses = new List<Course>
{
// this will have CourseId = 1
new Course { Title = "Classic English", Description = "Some Description", Department = departments.FirstOrDefault(d => d.DepartmentId == 1) },
// this will have CourseId = 2
new Course { Title = "Drama", Description = "Some Description", Department = departments.FirstOrDefault(d => d.DepartmentId == 1) },
// both of the above courses will be added to Department with DepartmentId = 1
// more courses
};
courses.ForEach(c => context.Courses.Add(c));
context.SaveChanges();
// now add the two courses to the department
departments[0].Courses.Add(courses[0]); // in list departments at index 0 add course from list courses at index 0
departments[0].Courses.Add(courses[1]); // in list departments at index 0 add course from list courses at index 1
context.SaveChanges();
}
答案 1 :(得分:0)
由于您自己生成主键,
你需要放
[DatabaseGenerated(DatabaseGenerationOption.None)]
CourseId和DepartmentId的属性,以便Entity框架知道您正在生成密钥。
更好的选择是继续依赖主键的EntityFramework,但稍微改变一下你的方法
var courses = new List<Course>
{
new Course {Title = "Classic English", Description = "Some Description", Department=
new Department { Title = "English", Description ="English
Department", Courses = new List<Course>() }},
.....
};
courses.ForEach(t => context.Courses.Add(t));
因此,您需要保存课程,并且由于您正在关联该部门,因此将隐式保存。
祝你的截止日期好运!
答案 2 :(得分:0)
我是这样做的,你只需要在'parent'之前初始化'children',不需要SaveChanges():
var choices = new List<Choices>
{
new Choices { Description = "Choice1" },
new Choices { Description = "Choice2" },
new Choices { Description = "Choice3" },
new Choices { Description = "Choice4" }
};
choices.ForEach(c => context.Choices.AddOrUpdate(c));
context.Questions.AddOrUpdate(
p => p.ID,
new Question { QuestionText = "Question ?", Choices = choices }
);