Двунаправленный дубликат ключа EF Core «многие-ко-многим»C#

Место общения программистов C#
Ответить
Anonymous
 Двунаправленный дубликат ключа EF Core «многие-ко-многим»

Сообщение Anonymous »

Кажется, я запутался в этой теме :(
У меня проблема с отображением очень распространенной связи NxM с помощью EF Core 8.
Давайте упростим. Это классы сущностей

Код: Выделить всё

public sealed class Student {
private readonly List _classes;

public int StudentId { get; set; }
public string Name { get; set; }

public IReadOnlyCollection Classes {
get {
return _classes;
}
}

public void AddClass(Class entity) {
_classes.Add(entity);
}
}

public sealed class Class {
private readonly List _students;

public int ClassId { get; set; }
public string Name { get; set; }

public IReadOnlyCollection Students {
get {
return _students;
}
}

public void AddStudent(Student entity) {
_students.Add(entity);
}
}
Я использую объект явного соединения, содержащий только идентификаторы обоих объектов

Код: Выделить всё

public sealed class StudentClass {
public int StudentId { get; set; }
public int ClassId { get; set; }
}
Тогда давайте посмотрим на сопоставление

Код: Выделить всё

//Student
builder
.HasMany(x => x.Classes)
.WithMany(x => x.Students)
.UsingEntity(
"StudentClasses",
l => l
.HasOne()
.WithMany()
.HasForeignKey(r => r.ClassId)
.HasPrincipalKey(r => r.StudentId)
.IsRequired(),
r => r
.HasOne()
.WithMany()
.HasForeignKey(u => u.ClassId)
.HasPrincipalKey(u => u.StudentId)
.IsRequired(),
j => {
j.HasKey(ur => new { ur.StudentId, ur.ClassId });
j.ToTable(TableNames.StudentClassTableName);
}
);

//Class
builder
.HasMany(x => x.Students)
.WithMany(x => x.Classes)
.UsingEntity(
"StudentClasses",
l => l
.HasOne()
.WithMany()
.HasForeignKey(r => r.StudentId)
.HasPrincipalKey(r => r.ClassId)
.IsRequired(),
r => r
.HasOne()
.WithMany()
.HasForeignKey(u => u.StudentId)
.HasPrincipalKey(u => u.ClassId)
.IsRequired(),
j => {
j.HasKey(ur => new { ur.StudentId, ur.ClassId });
j.ToTable(TableNames.StudentClassTableName);
}
);
Моя цель — реализовать простой вариант использования, например, «Зарегистрироваться ученика в классе» или аналогично «Добавить ученика в класс», используя код, подобный следующему, в действии контроллера< /p>

Код: Выделить всё

public IActionResult RegisterStudentToClass(int studentId, int classId) {
var student = _context
.Students
.Include(s => s.Classes)
.SingleOrDefault(s => s.StudentId == studentId);
var class = _context
.Classes
.SingleOrDefault(c => c.ClassId == classId);

student.AddClass(class);
_context.SaveChanges();   //>>>>>> Error happens here
}
Однако, когда я пытаюсь вызвать метод AddToClass, при SaveChanges EF Core пытается вставить объект класса в базу данных, который заканчивается на Microsoft.Data.SqlClient .SqlException (0x80131904): нарушение ограничения PRIMARY KEY «PK_StudentClass». Невозможно вставить дубликат ключа в объект «dbo.StudentClass». Повторяющееся значение ключа: ...
Моя цель — добавить только новую связь внутри StudentClass. Однако похоже, что EF Core также пытается вместо этого снова добавить предыдущие существующие отношения, которые были загружены с помощью Student.
Есть предложения?

Подробнее здесь: https://stackoverflow.com/questions/791 ... licate-key
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»