我是一个初学者,并尝试通过向用户发布请求来建立多对多关系
/ApplyCourse/?studentId=1003&courseId=3
但出现以下错误:
SqlException:违反PRIMARY KEY约束“ PK_StudentCourses”。无法在对象'dbo.StudentCourses'中插入重复的密钥。重复的键值为(1003,3)。
我在做什么错?建立多对多关系的好方法是什么?
[Route("CourseApply")]
[HttpPost("{studentId}/{courseId}")]
public async Task<IActionResult> CourseApply(int studentId, int courseId)
{
Student studentEntity = _context.Students.Find(studentId);
Course courseEntity = _context.Courses.Find(courseId);
StudentCourse enrollment = new StudentCourse();
enrollment.Course = courseEntity;
enrollment.Student = studentEntity;
_context.StudentCourses.Add(enrollment);
await _context.SaveChangesAsync();
return CreatedAtAction("GetStudent", new { id = studentEntity.Id }, studentEntity);
}
public class StudentCourse
{
public int StudentId { get; set; }
public Student Student { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
}
public class Course
{
public int Id { get; set; }
public string Name { get; set; }
public IList<StudentCourse> Students { get; set; }
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public IList<StudentCourse> Courses { get; set; }
}
答案 0 :(得分:1)
您的主键是复合键:StudentId, CourseId
。数据库中已经有StudentId = 1003; CourseId = 3
的组合;因此您不能插入具有相同值的另一行。
您需要确定是否要允许这样的重复项-然后创建一个单独的键列(将其命名为Id
或StudentCourseId
,然后实体框架会自动将其用作主键)。或者,如果您不允许学生/课程的重复组合,则需要处理此类错误(例如,通过重定向用户以更新现有记录,而不是插入新记录)
我个人而言,我尽量避免使用组合键...但是我想这是个人喜好问题