在我的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架构。