违反PRIMARY KEY约束“ PK_StudentCourses”。无法插入重复密钥

时间:2018-08-11 20:37:37

标签: c# entity-framework-core

我是一个初学者,并尝试通过向用户发布请求来建立多对多关系

/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; }
}

1 个答案:

答案 0 :(得分:1)

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

您需要确定是否要允许这样的重复项-然后创建一个单独的键列(将其命名为IdStudentCourseId,然后实体框架会自动将其用作主键)。或者,如果您不允许学生/课程的重复组合,则需要处理此类错误(例如,通过重定向用户以更新现有记录,而不是插入新记录)

我个人而言,我尽量避免使用组合键...但是我想这是个人喜好问题