2011-03-13 4 views
0

, I는 가지고EF에서 다 대다 관계에서 선택된 관계를 삭제 하시겠습니까? SQL에서

[밴드] 1 ---- * BandsGenres * ---- 1 장르] 내 EF 층에서

, 그것이 번역에 :

[밴드] * ---- * [장르]

(BandsGenres BandId 및 GenreId입니다)

내 문제는 내가 삭제하는 방법을 알아낼 수없는 것입니다

내가 선택한 선정 된 관계. 기본적으로 밴드 장르 목록을 업데이트하려고합니다. Guids의 목록이 전달되고 조인을 사용하여 Guid를 가져올 수 있습니다. 그러나 .Remove() 메서드는 이전 장르를 제거하고 새로운 장르를 추가하는 것이 아닙니다. .Attach (g) 및 .DeleteObject (g)를 사용하여 시도했지만 관계 대신 실제 장르 (장르)를 제거했습니다.

public void UpdateBandGenres(Guid bandId, IEnumerable<Guid> genres) 
{ 
    using (var ctx = new OpenGroovesEntities()) 
    { 
     var newGenres = from g in ctx.Genres 
         join t in genres on g.GenreId equals t 
         select g; 

     //var bandGenres = ctx.Genres.Include("Bands").Where(g => g.Bands.Any(b => b.BandId == bandId)); 
     var bandGenres = ctx.Bands.SingleOrDefault(b => b.BandId == bandId).Genres; 

     bandGenres.ToList().ForEach(g => 
     { 
      bandGenres.Remove(g); 
     }); 

     newGenres.ToList().ForEach(g => bandGenres.Add(g)); 

     ctx.SaveChanges(); 
    } 
} 

장르 ID 목록이있는 경우 어떻게 밴드의 장르 관계 목록을 삭제하거나 추가하거나 업데이트 할 수 있습니까? 감사. 내가 correcly 문제를 이해한다면

답변

3

genres 수집은 UpdateBandGenres 방법 (뿐 아니라 목록에 추가하거나 목록 삭제)를 실행의 결과로 Band 장르 목록에 있어야 모든 Genre 개체를 포함합니다. 이 경우 가장 간단한 방법은 컬렉션에서 모든 장르를 삭제하고 genres 컬렉션에있는 Guid의 모든 장르를 추가하는 것입니다.

var newGenres = ctx.Genres.Where(g => genres.Contains(g.GenreId)); 

둘째, 당신의 BandGenres 테이블을 수정하는 EF을 말할 것이다 그 Genres 모음을 수정하기 때문에, Band 개체를 가져해야합니다

모든

첫째, 필요하지 않은이 newGenres이 잡아 조인 SQL : 그 후

Band band = ctx.Bands.SingleOrDefault(b => b.BandId == bandId); 

당신은 band.Genres 수집을 지우고 상단에 newGenres를 추가 할 수 있습니다. 결과적으로 코드는 다음과 같이 표시됩니다.

public void UpdateBandGenres(Guid bandId, IEnumerable<Guid> newGenreIds) 
{ 
    using (var ctx = new OpenGroovesEntities()) 
    { 
     List<Genre> newGenres = ctx. 
           Genres. 
           Where(g => newGenreIds.Contains(g.GenreId)). 
           ToList(); 

     Band band = ctx.Bands.Single(b => b.BandId == bandId); 
     band.Genres.Clear(); 
     newGenres.ForEach(band.Genres.Add); 

     ctx.SaveChanges(); 
    } 
} 

Btw 또한 변수 이름 지정과 일관되게하는 것이 좋습니다. IEnumerable<Guid> genres은 실제로는 Guid의 모음이고 Genre 개체의 모음이 아니기 때문에 오해의 소지가 있습니다. 따라서 Guid bandId 변수 이름과 일치하도록 newGenreIds을 지정했습니다.

관련 문제