无法使用Entity Framework更新子实体

时间:2015-12-10 10:41:09

标签: c# asp.net entity-framework

这些是我的模型类。

public class Survey
{
    [Key]
    public int SurveyID { get; set; }
    [Required]
    public string Title { get; set; }
    [DataType(DataType.Text)]
    [Required]
    public string Description { get; set; }
    public virtual Category Category { get; set; }
}

public class Category
{
    [Key]
    public int CategoryID { get; set; }
    public string CategoryText { get; set; }
}

SurveyController的编辑操作中,调查属性正在更新,但不是类别。

以下是编辑操作代码。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Survey survey)
{
    db.Database.Log = s => Debug.WriteLine(s);

    if (ModelState.IsValid)
    {
        db.Entry(survey).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(survey);
}

1 个答案:

答案 0 :(得分:2)

默认情况下,实体框架不会更新导航属性。 EF仅知道/跟踪您明确更新的属性中的更改。如果使用相同的上下文检索父对象,EF只能保存子对象。

作为一种解决方案,您需要显式迭代您的子属性并将其状态设置为已修改。

示例代码

 foreach (var childModel in model.Children)
    {
        var existingChild = existingParent.Children
            .Where(c => c.Id == childModel.Id)
            .SingleOrDefault();

        if (existingChild != null)
           _dbContext.Entry(existingChild).CurrentValues.SetValues(childModel);
    }

<强>更新

var child = new ChildEntity() {Id = 1};
child.ParentEntityId = 1;  // Assigning FK
context.Childs.Attach(child);
context.Entry(child).State = EntityState.Modified;
context.SaveChanges();