我有一个动作
[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;
最初我试图查询现有的孩子,并将每个孩子与新的孩子进行比较,但似乎过于复杂。
更新会员及其所有孩子的最佳方式是什么?
答案 0 :(得分: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 Code First的原生支持。什么对你有帮助EntityFramework.Extended。这将允许您执行以下操作:
db.AgeBrackets.Delete(a => a.MemberId == member.MemberId);
你应该自己照顾变化轨道。 希望它可以帮到你。