首页 > 解决方案 > 违反主键约束“PK_StudentCourses”。无法插入重复键

问题描述

我是初学者,并尝试使用对用户的发布请求创建多对多关系

/ApplyCourse/?studentId=1003&courseId=3

但我收到以下错误:

SqlException:违反主键约束“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; }
}

标签: c#entity-framework-core

解决方案


您的主键是复合的:StudentId, CourseId. 您已经StudentId = 1003; CourseId = 3在数据库中组合了;因此您不能插入具有相同值的另一行。

您需要决定是否要允许此类重复 - 然后创建一个单独的键列(调用它IdStudentCourseId实体框架将自动将其用作主键)。或者,如果您不允许 Student / Course 的重复组合,那么您需要处理此类错误(例如,通过重定向用户来更新现有记录,而不是插入新记录)

就个人而言,我尽量避免使用复合键......但我想,这是一个偏好问题


推荐阅读