c# - 违反主键约束“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; }
}
解决方案
您的主键是复合的:StudentId, CourseId
. 您已经StudentId = 1003; CourseId = 3
在数据库中组合了;因此您不能插入具有相同值的另一行。
您需要决定是否要允许此类重复 - 然后创建一个单独的键列(调用它Id
或StudentCourseId
实体框架将自动将其用作主键)。或者,如果您不允许 Student / Course 的重复组合,那么您需要处理此类错误(例如,通过重定向用户来更新现有记录,而不是插入新记录)
就个人而言,我尽量避免使用复合键......但我想,这是一个偏好问题
推荐阅读
- javascript - 为什么在找到 === 而不是返回语句指示的“是”时函数返回未定义?
- reactjs - 用于钩子的 React-devtools?
- javascript - 从点击触发的新页面获取点击的 html 元素
- android - 在 Uno.Platform 中从 ViewModel 设置位图不适用于 Android
- python - 使用通用视图的 django rest 框架电子邮件验证
- mongodb - NestJS、MongoDB、Mongoose、GraphQL - 重复自己描述用户或任何模型
- ios - 多个应用程序用户访问 CloudKit 中的私有数据库
- unity3d - 使用 ScreenCapture.CaptureScreenshotAsTexture() 后如何显示纹理;
- javascript - 在段落之后插入元素(不仅仅是节点)
- javascript - 如何从 UWP WebView 中提取 httponly cookie?