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

你应该自己照顾改变轨道。 希望它可以帮助你。