如何处理EF中的子更新

时间:2012-03-15 06:19:15

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4 entity-relationship

我有一个动作

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

最初我试图查询现有的孩子,并将每个孩子与新的孩子进行比较,但似乎过于复杂。

更新会员及其所有孩子的最佳方式是什么?

1 个答案:

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

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