2015-04-26 11 views
5

Tôi có 3 bảng: Video, CourseCourseVideo. Tôi muốn làm một chèn vào CourseVideo.Khung thực thể chèn nhiều bản ghi với cha mẹ hiện có

Video có thể có hoặc không có bản ghi hiện có, nhưng khi nào tôi muốn sử dụng bản ghi hiện có và KHÔNG tạo bản ghi mới.

Mã của tôi trông như thế này:

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(); 

này thêm một kỷ lục trong nhiều-nhiều bảng (CourseVideo) nhưng nó cũng tạo ra một kỷ lục mới trong bảng Video.

Làm cách nào để ngăn việc chèn vào bảng Video nếu nó đã tồn tại?

+0

Trong trường hợp nào nó thêm video trùng lặp: khi nó đã tồn tại hoặc khi nó không tồn tại? –

+0

Khi nó đã tồn tại – socketman

+1

Nhìn vào mã tôi không thấy lý do tại sao nó sẽ chèn nó hai lần. Có phải tất cả điều này trong một câu lệnh 'using (MyContext)' hay chúng được truy xuất riêng biệt? Một đối tượng 'video' tách rời sẽ giải thích hành vi bạn đang thấy. –

Trả lời

-1

EF không kiểm tra nếu mục nhập tồn tại trong trường hợp quan hệ N: M theo mặc định.

Bạn nên đặt những thay đổi khóa học của bạn bên trong if báo cáo:

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

Để ngăn chặn sự chèn vào bảng video nếu nó đã tồn tại, đoạn video được thêm vào phải trong bối cảnh. Bạn không cần phải gọi savechanges() cho video mới.

Các vấn đề liên quan