编辑父级时更新子对象

时间:2013-09-07 11:51:53

标签: asp.net-mvc entity-framework

我正在努力在编辑帖子操作中更新相关实体。

我有一个Job和JobNotes模型,如下所示:

public class Job
{
    public Job()
    {
        JobNotes = new List<JobNote>();
    }
    [Key]
    public int JobID { get; set; }
    public string jobName { get; set; }
    public ICollection<JobNote> JobNotes { get; set; }
}

public class JobNote
{
    [Key]
    public int JobNoteID { get; set; }
    public string Author { get; set; }
    public string Note { get; set; }
    public Job Job { get; set; }
}

我还使用Fluent API来映射我的关系:

(关于我是否正确完成此操作的任何反馈都是最受欢迎的!)

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Job>()
                .HasMany(x => x.JobNotes)
                .WithOptional(y => y.Job);
}

问题是在我的Post方法中,我的JobNotes对象被添加到父Job对象,但没有保存到数据库。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(JobViewModel model)
{

    if (ModelState.IsValid)
    {
        var existingJob = db.Jobs
            .Include(x => x.JobNotes)
            .Single(c => c.JobID == model.Job.JobID);

        model.Job.JobNotes.Add(new JobNote
        {
            Author = "System",
            Note = "Job modified by " + User.Identity.Name
        });

        db.Entry(existingJob).CurrentValues.SetValues(model.Job);

        db.SaveChanges();

        return RedirectToAction("Details", new { id = model.Job.JobID });
    }
}

我做错了什么?在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

使用existingJob代替model.Job添加新的JobNote

existingJob.JobNotes.Add(...);

当调用SaveChanges时,EF会检测到新笔记(基于已经附加的existingJob)并将其添加到上下文中,然后插入到数据库中。

顺便说一下,您不需要在此过程中包含现有注释,因此您可以删除.Include(x => x.JobNotes)