C# 将实体框架通用存储库与web api和多对多关系结合使用
在我的Web API应用程序中,我实现了本文中描述的通用存储库模式。 所以现在每当我创建一个CRUDAPI控制器时,我都会使用一个使用存储库与数据库对话的服务 假设我有两个实体模型C# 将实体框架通用存储库与web api和多对多关系结合使用,c#,entity-framework,C#,Entity Framework,在我的Web API应用程序中,我实现了本文中描述的通用存储库模式。 所以现在每当我创建一个CRUDAPI控制器时,我都会使用一个使用存储库与数据库对话的服务 假设我有两个实体模型 public class Student { public Student() { this.Courses = new HashSet<Course>(); } public int StudentId { get; set; } [Requi
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; }
}
在前端,每当我向api发送post请求时,如:
/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获取所有课程并覆盖传入的
学生。我从数据库中获取的课程
这很有效,但对我来说,这似乎是一种不好的做法。我认为做这个服务存储库的全部目的是拥有一个干净的后端,类似于微服务体系结构 这种通用存储库模式实现非常幼稚,特别是
Edit
方法在任何EF版本中都不起作用。分离的相关实体需要特别注意。所以,您修复了此问题,但不喜欢您的修复?如果在不影响服务接口的情况下通过更改实现修复了您的服务,那么我认为您刚刚实现了面向组件的体系结构和依赖项注入的承诺(假设您使用它),您应该高兴地走开。架构的“清洁度”是这样来的:它不能保证后端不会有一些丑陋(并且总是会有丑陋,在EF中合并对象图),只是丑陋被包含了,既谨慎又谨慎。是的,我使用依赖项注入,不,我没有更改接口,我只需要将两个存储库注入到我的服务中,而不是一个。这种通用存储库模式实现非常幼稚,特别是Edit
方法在任何EF版本中都不起作用。分离的相关实体需要特别注意。所以,您修复了此问题,但不喜欢您的修复?如果在不影响服务接口的情况下通过更改实现修复了您的服务,那么我认为您刚刚实现了面向组件的体系结构和依赖项注入的承诺(假设您使用它),您应该高兴地走开。架构的“清洁度”是这样来的:它不能保证后端不会有一些丑陋(并且总是会有丑陋,在EF中合并对象图),只是丑陋被包含了,是的,我使用依赖注入,不,我没有改变接口,我只需要将两个存储库注入到我的服务中,而不是一个。
/api/Students : Post
{
"id": 9999,
"studentName":"string",
"CourseId":13
}