将实体框架通用存储库与web api和多对多关系一起使用

时间:2017-03-15 17:50:28

标签: c# entity-framework

在我的Web API应用程序中,我按照此post中的描述实现了通用存储库模式。 所以现在每当我创建一个Crud Api控制器时,我都会使用一个使用存储库与数据库通信的服务。

假设我有这两个实体模型

public class Student
{
    public Student() 
    {
        this.Courses = new HashSet<Course>();
    }

    public int StudentId { get; set; }
    [Required]
    public string StudentName { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
     public Course()
     {
        this.Students = new HashSet<Student>();
     }
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

我的控制器和服务类如下

public class StudentsController 
{
    private StudentsService studentService;

   // CRUD Api Methods...
}

public class StudentService
{
    private StudentsRepository studentsRepo;

   // CRUD Api Methods...
}

每当我向api发送帖子请求时,在前端:

/api/Students : Post
{
  "id": 9999,
   "studentName":"string",
   "Courses":[
    {
      "id":13
    }, 
    {
      "id":25
    }]
}

由于某些奇怪的原因,存储库尝试创建这两个新课程,即使它们存在于数据库中也会失败。 如果我将关系更改为一对多,并将帖子更改为仅发送一个这样的课程ID

/api/Students : Post
{
  "id": 9999,
   "studentName":"string",
    "CourseId":13
}

EF成功保存更改。

我设法通过在我的实例化中实例化两个存储库来完成这项工作 学生服务,然后从传入的学生模型中获取所有ID 调用courseRepo来获取所有课程并覆盖传入 Student.Courses与我从数据库中获取的那些课程。

这有效,但对我来说这似乎是一种不好的做法。我认为这个服务库的全部目的是拥有一个干净的后端,比如MicroServices架构。

0 个答案:

没有答案