asp.net-mvc - 如何在 EF 中处理子级更新

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

我有一个行动

[HttpPost]
public string Edit(Member 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;

最初,我试图查询现有的子项并将它们与新的集合进行比较,但它似乎过于复杂。

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

最佳答案

还有另一种方法

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 的 native 支持。对您有帮助的是 EntityFramework.Extended 。这将允许您执行以下操作:

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

您应该自己处理变更轨迹。 希望对您有帮助。

关于asp.net-mvc - 如何在 EF 中处理子级更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9714860/

相关文章:

asp.net-mvc-3 - html.dropdownlist MVC3 困惑

c# - Entity Framework 迁移,对现有数据进行反规范化并引入外键

.net - 重新创建上下文时,wpf mvvm datagrid丢失排序

c# - 无法在 MVC 项目 Visual Studio 2015 中打开数据库

asp.net-mvc - 如何使嵌套母版页 Razor 部分未定义?

c# - 何时使用单例、 transient 和使用 Ninject 和 MongoDB 的请求

c# - ModelMetaData、Custom Class Attributes 和一个难以描述的问题

c# - asp.net core 中 GetUserManager 的替代

asp.net-mvc - 在 MVC 中使用输出缓存作为对象参数

c# - 无法在 ASP.Net MVC 3 项目中使用 Entity Framework 保存更改