我有两个实体学生和班级。我用Code First Entity Framework创建了数据库,我想让它创建一个多对多关系表。
public class Student
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Class> Classes { get; set; }
}
public class Class
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Student> Students { get; set; }
}
这在DB中创建了三个表:Students,Classes和StudentsClasses(使用StudentId和ClassId)。
现在我已经搭建了web api控制器,它创建了StudentController和ClassController。我现在可以单独为学生和班级实体制作CRUD,但是如何对关系表(StudentsClasses)进行CRUD?该表的另一个控制器?还是多个POST参数?
我真正的问题是我希望在我的客户端发布一个类,然后POST一个学生,最后将一个学生POST到一个类(应该在关系表StudentsClasses中)。
答案 0 :(得分:0)
正如我从您的问题中可以理解的那样,您将在数据库中创建Student
和Class
(也许每个人都有一个包含CRUD操作的页面)。然后,您将有另一个页面负责向现有学生添加课程。
如果这是您想要的,您只需要更新现有用户并填充Classes
实体的Student
属性。
例如:您想向学生Math 1
插入课程Chemistry 1
和John
:
using (var dbContext = new SchoolContext())
{
//Get the existing student "John by its id"
var student = context.Student.FirstOrDefault(x => x.Id == id);
//fetch the classes from database (by id)
var math = context.Class.FirstOrDefault(x => x.Id == mathId);
var chemistry = context.Class.FirstOrDefault(x => x.Id == chemId);
student.Classes.Add(math);
student.Classes.Add(chemistry);
context.Entry(student).State = EntityState.Modified;
context.SaveChanges();
}
1 - 请注意,您需要处理现有学生已经上课的情况。在这种情况下,您可以删除所有现有的类,只关心那些类,或创建某种验证来处理它。
2 - 如果您最终没有从数据库中提取学生或类,则会创建它们。所以,如果你这样做:
using (var dbContext = new SchoolContext())
{
var student = new Student { Name = "John"};
var math = new Class { Name = "Math 1"};
var chemistry = new Class { Name = "Chemistry 1"};
student.Classes.Add(math);
student.Classes.Add(chemistry);
context.Student.Add(student);
context.SaveChanges();
}
实体框架将在Student
中创建记录,在Class
中创建2条记录,在关系表StudentClass
中创建两条记录