С точки зрения сущностей (или объектов) у вас есть Class
объект, который имеет коллекцию, Students
и Student
объект, который имеет коллекцию Classes
. Поскольку ваша StudentClass
таблица содержит только идентификаторы и не содержит дополнительной информации, EF не создает сущность для присоединяемой таблицы. Это правильное поведение, и этого вы ожидаете.
Теперь, выполняя вставки или обновления, попробуйте мыслить объектами. Например, если вы хотите вставить класс с двумя учениками, создайте Class
объект, Student
объекты, добавьте учеников в Students
коллекцию классов, добавьте Class
объект в контекст и вызовите SaveChanges
:
using (var context = new YourContext())
{
var mathClass = new Class { Name = "Math" };
mathClass.Students.Add(new Student { Name = "Alice" });
mathClass.Students.Add(new Student { Name = "Bob" });
context.AddToClasses(mathClass);
context.SaveChanges();
}
Это создаст запись в Class
таблице, две записи в Student
таблице и две записи в StudentClass
таблице, связывающие их вместе.
Вы в основном делаете то же самое для обновлений. Просто получите данные, измените график, добавив и удалив объекты из коллекций, вызовите SaveChanges
. Проверьте этот же вопрос для деталей.
Редактировать :
Согласно вашему комментарию, вам нужно вставить новый Class
и добавить Students
к нему два существующих :
using (var context = new YourContext())
{
var mathClass= new Class { Name = "Math" };
Student student1 = context.Students.FirstOrDefault(s => s.Name == "Alice");
Student student2 = context.Students.FirstOrDefault(s => s.Name == "Bob");
mathClass.Students.Add(student1);
mathClass.Students.Add(student2);
context.AddToClasses(mathClass);
context.SaveChanges();
}
Поскольку оба студента уже находятся в базе данных, они не будут вставлены, но поскольку они теперь находятся в Students
коллекции Class
, две записи будут вставлены в StudentClass
таблицу.
Попробуйте это для обновления:
источник
Я хотел добавить к этому свой опыт. Действительно, EF, когда вы добавляете объект в контекст, он изменяет состояние всех дочерних и связанных сущностей на «Добавлено». Хотя в этом правиле есть небольшое исключение: если дочерние / связанные сущности отслеживаются одним и тем же контекстом, EF понимает, что эти сущности существуют, и не добавляет их. Проблема возникает, когда, например, вы загружаете дочерние / связанные объекты из какого-либо другого контекста или веб-интерфейса и т.д., а затем да, EF ничего не знает об этих объектах и идет и добавляет их все. Чтобы этого избежать, просто возьмите ключи сущностей и найдите их (например,
context.Students.FirstOrDefault(s => s.Name == "Alice"))
в том же контексте, в котором вы хотите выполнить добавление.источник
Я использую следующий способ обработки отношения «многие ко многим», в котором задействованы только внешние ключи.
Итак, для вставки :
Для удаления ,
источник
В структуре сущностей, когда объект добавляется в контекст, его состояние изменяется на Добавлен. EF также изменяет состояние каждого объекта, добавляемого в дерево объектов, и, следовательно, вы либо получаете ошибку нарушения первичного ключа, либо повторяющиеся записи добавляются в таблицу.
источник