【问题标题】:Violation of PRIMARY KEY constraint 'PK_StudentCourses'. Cannot insert duplicate key违反主键约束“PK_StudentCourses”。无法插入重复键
【发布时间】:2018-08-11 20:37:37
【问题描述】:

我是一个初学者,正在尝试使用对用户的发布请求来创建多对多关系

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

【问题讨论】:

  • StudentCourse 在模型中没有 ID;但我假设数据库中有一些主键。你能详细说明它在DbContext中是如何定义的吗?
  • 我在 OnModelCreating() 中使用复合键。 modelBuilder.Entity().HasKey(sc => new { sc.StudentId, sc.CourseId });

标签: c# entity-framework-core


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-06-30
    • 2017-06-09
    • 2021-05-08
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多