关系表中的WebAPI CRUD与实体代码优先

时间:2015-03-06 16:56:22

标签: asp.net asp.net-mvc entity-framework asp.net-web-api ef-code-first

我有两个实体学生和班级。我用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中)。

1 个答案:

答案 0 :(得分:0)

正如我从您的问题中可以理解的那样,您将在数据库中创建StudentClass(也许每个人都有一个包含CRUD操作的页面)。然后,您将有另一个页面负责向现有学生添加课程。

如果这是您想要的,您只需要更新现有用户并填充Classes实体的Student属性。 例如:您想向学生Math 1插入课程Chemistry 1John

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中创建两条记录