2015-04-26 7 views
5

Mam 3 tabele: Video, Course i CourseVideo. Chcę wstawić wstawkę do CourseVideo.Entity Framework wstawia wiele do wielu rekordów z istniejącymi rodzicami

Numermoże być lub nie może istnieć, ale kiedy to zrobi, chcę użyć istniejącego rekordu i NIE tworzyć nowego rekordu.

Mój kod wygląda następująco:

var video = db.Videos.SingleOrDefault(c => c.Link.Equals(link)); 

if(video == null) 
{ 
    video = new Video { ... }; 
    db.Videos.Add(video); 
    db.SaveChanges(); 
} 

var course = db.Courses.Include("Videos").Single(c => c.ID == courseID); 
course.Videos.Add(video); 
db.SaveChanges(); 

Dodaje rekord w wielu-do-wielu tabeli (CourseVideo), ale również tworzy nowy rekord w tabeli Video.

Jak zapobiec wstawianiu do tabeli Video, jeśli już istnieje?

+0

W jakim scenariuszu dodaje duplikat wideo: kiedy już istnieje lub kiedy nie istnieje? –

+0

Kiedy już istnieje – socketman

+1

Patrząc na kod, nie widzę powodu, dla którego wstawiłbym go dwa razy. Czy to wszystko w jednym 'użyciu (MyContext)' lub są one pobierane osobno? Oddzielony obiekt 'video' wyjaśniłby zachowanie, które widzisz. –

Odpowiedz

-1

EF nie sprawdza, czy pozycja istnieje domyślnie w przypadku relacji N: M.

Należy umieścić swoje zmiany kursu wewnątrz sprawozdania if:

var video = db.Videos.SingleOrDefault(c => c.Link.Equals(link)); 

if(video == null) 
{ 
    video = new Video { ... }; 
    db.Videos.Add(video); 
    db.SaveChanges(); 
    var course = db.Courses.Include("Videos").Single(c => c.ID == courseID); 
    course.Videos.Add(video); 
    db.SaveChanges(); 
} 
0

Aby zapobiec wstawić do tabeli wideo, jeśli już istnieje, dodany film musi być w kontekście. Nie musisz wywoływać savechanges() dla nowego wideo.