Pod względem bytów (lub obiektów) masz Class
obiekt, który ma kolekcję Students
i Student
obiekt, który ma kolekcję Classes
. Ponieważ StudentClass
tabela zawiera tylko identyfikatory i nie zawiera dodatkowych informacji, EF nie generuje jednostki dla tabeli łączącej. To jest właściwe zachowanie i tego właśnie oczekujesz.
Teraz, robiąc wstawki lub aktualizacje, staraj się myśleć kategoriami obiektów. Np. Jeśli chcesz wstawić klasę z dwoma uczniami, utwórz Class
obiekt, Student
obiekty, dodaj uczniów do Students
kolekcji klas, dodaj Class
obiekt do kontekstu i wywołaj 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();
}
Spowoduje to utworzenie wpisu w Class
tabeli, dwóch wpisów w Student
tabeli i dwóch wpisów w StudentClass
tabeli łączących je ze sobą.
Zasadniczo robisz to samo w przypadku aktualizacji. Wystarczy pobrać dane, zmodyfikować wykres, dodając i usuwając obiekty z kolekcji, zadzwoń SaveChanges
. Sprawdź to podobne pytanie, aby uzyskać szczegółowe informacje.
Edycja :
Zgodnie z Twoim komentarzem musisz wstawić nowy Class
i dodać Students
do niego dwa istniejące :
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();
}
Ponieważ obaj uczniowie są już w bazie danych, nie zostaną wstawieni, ale ponieważ znajdują się teraz w Students
kolekcji Class
, do StudentClass
tabeli zostaną wstawione dwa wpisy .
Wypróbuj ten do aktualizacji:
źródło
Chciałem dodać do tego swoje doświadczenie. Rzeczywiście, EF, po dodaniu obiektu do kontekstu, zmienia stan wszystkich elementów podrzędnych i powiązanych jednostek na Added. Chociaż w tej regule występuje mały wyjątek: jeśli jednostki podrzędne / powiązane są śledzone przez ten sam kontekst, EF rozumie, że te jednostki istnieją i nie dodaje ich. Problem występuje, gdy na przykład ładujesz elementy podrzędne / powiązane z innym kontekstem lub interfejsem sieciowym itp., A następnie tak, EF nie wie nic o tych jednostkach i dodaje je wszystkie. Aby tego uniknąć, po prostu zdobądź klucze encji i znajdź je (np.
context.Students.FirstOrDefault(s => s.Name == "Alice"))
W tym samym kontekście, w którym chcesz wykonać dodanie.źródło
Używam następującego sposobu do obsługi relacji wiele-do-wielu, w których biorą udział tylko klucze obce.
Więc do wstawienia :
Do usunięcia ,
źródło
W ramach jednostki, gdy obiekt jest dodawany do kontekstu, jego stan zmienia się na Dodano. EF zmienia również stan każdego obiektu na dodany w drzewie obiektów, a zatem otrzymujesz błąd naruszenia klucza podstawowego lub zduplikowane rekordy są dodawane do tabeli.
źródło