2

兒童更新我有一個動作如何處理在EF

[HttpPost] 
public string Edit(Member member) 

和會員有孩子實體ICollection<AgeBracket> AgeBrackets的集合。

目前我確實檢索與該成員相關的所有A geBrackets,將所有人標記爲已刪除,然後遍歷新收藏併爲每個收藏創建一個新條目。然後我更新我的父實體。它的工作原理,但應該有一個更好的方式來做到這一點:

例如,如果我會寫SQL,我可以只用一行

DELETE FROM AgeBrackets WHERE MemberId = @MemberId 

在我的情況下刪除所有現有的兒童它使選擇檢索現有項目,然後爲每個項目生成刪除,然後爲每個新的子項生成插入,然後爲父項生成更新。

這裏是我的代碼現在的樣子:

IList<AgeBracket> ageBrackets = db.AgeBrackets.Where<AgeBracket>(x => x.MemberId == member.MemberId).ToList(); 
     foreach (AgeBracket ab in ageBrackets) 
      db.Entry(ab).State = EntityState.Deleted; 
     if (member.AgeBrackets != null) 
     foreach (AgeBracket ab in member.AgeBrackets) 
     { 
      ab.MemberId = member.MemberId;     
      db.AgeBrackets.Add(ab); 
     } 
     db.Entry(member).State = EntityState.Modified; 

最初我是想查詢現有的兒童和他們每個人的比較新集,但它似乎是過於複雜。

什麼是更新成員及其所有孩子的最佳方式?

回答

2

還有另一種方式來做到

var originalAgeBrackets = db.AgeBrackets.Where(x => x.MemberId == member.MemberId).ToArray(); 
var currentAgeBrackets = member.AgeBrackets; 

foreach (var original in originalAgeBrackets) { 
    // check if the original age brackets were modified ou should be removed 
    var current = currentAgeBrackets.FirstOrDefault(c => c.AgeBracketId == original.AgeBracketId); 

    if(current != null) { 
     var entry = db.Entry(original); 
     entry.OriginalValues.SetValues(original); 
     entry.CurrentValues.SetValues(current); 
    } else { 
     db.Entry(original).State = EntityState.Deleted; 
    } 
} 

// add all age brackets not listed in originalAgeBrackets 
foreach (var current in currentAgeBrackets.Where(c => !originalAgeBrackets.Select(o => o.AgeBracketId).Contains(c.AgeBracketId))) { 
    db.AgeBrackets.Add(current); 
} 

db.SaveChanges(); 

不幸的是你想做的事有EF代碼第一次沒有原生支持的。什麼將幫助你將是EntityFramework.Extended。這將允許你做這樣的事情:

db.AgeBrackets.Delete(a => a.MemberId == member.MemberId); 

你應該自己照顧改變軌道。 希望它可以幫助你。