2013-05-02 88 views
1

當在ASP.NET MVC 4項目 「集合被修改」 的錯誤,我有一個模型LeagueMemberMVC 4和延遲加載:刪除多個記錄

public class LeagueMember 
{ 
    [Key, Column(Order = 0)] 
    public int MemberId { get; set; } 

    [Key, Column(Order = 1)] 
    public int LeagueId { get; set; } 

    public bool? IsActive { get; set; } 

    public virtual League League { get; set; } 

    public virtual Member Member { get; set; } 

} 

在聯賽模式,我有:

public virtual ICollection<LeagueMember> LeagueMembers { get; set; } 

Edit視圖League控制器的,我有一個下拉的LeagueMembers並在其編輯的行動我想刪除現有LeagueMembers和創造新的:

[HttpPost] 
public ActionResult Edit(LeagueMembersViewModel leagueMemberViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     var league = leagueMemberViewModel.League; 
     context.Entry(league).State = EntityState.Modified; 

     /* without this line the next foreach statement would complain that 
      League.LeagueMembers is null due to lazy loading..*/ 
     context.Entry(league).Collection("LeagueMembers").Load(); 

     var leagueMembers = leagueMemberViewModel.League.LeagueMembers; 

     foreach (var leagueMember in leagueMembers) 
     { 
      context.LeagueMembers.Remove(leagueMember); 
     } 

     foreach (var memberId in leagueMemberViewModel.SelectedMembers) 
     { 
      var leagueMember = new LeagueMember { MemberId = memberId, League = league }; 
      context.LeagueMembers.Add(leagueMember); 
     } 
     context.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    leagueMemberViewModel.MemberList = new MultiSelectList(context.Members, "Id", "Name", leagueMemberViewModel.SelectedMembers); 
    return View(leagueMemberViewModel); 
} 

在執行時,線foreach (var leagueMember in leagueMembers)上for循環的第二次迭代中抱怨:

集合已修改;枚舉操作可能不會執行

是否有更好的方式刪除一對多關係中的批量記錄?

在這種情況下,刪除全部leagueMemberViewModel.League.LeagueMembers也許沒有迭代收集?

喜歡的東西,免去:

context.Entry(league).Collection("LeagueMembers").Load(); 

var leagueMembers = leagueMemberViewModel.League.LeagueMembers; 
foreach (var leagueMember in leagueMembers) 
{ 
    context.LeagueMembers.Remove(leagueMember); 
} 

有:

leagueMember.League.LeagueMembers.Remove(); 

回答

1

我認爲你的代碼有一些錯別字。例如,它看起來像var league = leagueMember.League應該是var league = leagueMemberViewModel.League。在線之間的閱讀我懷疑leagueMembers是與所附的對象的聯盟成員相同。 (您通過設置EntityState.Modified附加)。

如果是這樣,則通過循環加載的集合並同時從中刪除項目來解釋錯誤。解決辦法很簡單:

foreach (var leagueMember in leagueMembers.ToArray()) // <= ToArray 

它將集合複製到不改變的本地數組。

至於你的第二個問題:沒有沒有內置的方式來在實體框架中進行批量刪除。

+0

它工作!感謝您的回答。我糾正了錯字。 :-) – Annie 2013-05-02 21:57:08

-1

這是一個常見的.NET錯誤,你可以通過用for循環更換您的foreach循環解決這個問題:

for (var i = 0; i < leagueMembers.Count; i++) 
{ 
    context.LeagueMembers.Remove(leagueMembers[i]); 
} 
+0

謝謝,但這不是.NET錯誤。該集合被修改!您的方法將無法使用,因爲LeageMembers是ICollection,因此不能使用索引運算符。 – Annie 2013-05-02 16:04:24

0

,同時通過它遍歷您不能修改的集合,最好的辦法是使用反向for循環是這樣的:

 for (int i = leagueMembers.Count - 1; i >= 0; i--) 
     { 
      context.LeagueMembers.Remove(leagueMembers[i]); 
     }