2013-09-07 5 views
1

Я пытаюсь обновить связанный объект в своем действии «Редактировать сообщение».Обновление дочерних объектов при редактировании родителя

У меня есть работа и модель 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 объект добавляется в родительский объект работы, но не сохраняются в базе данных.

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

Что я сделал не так? Заранее спасибо за вашу помощь.

ответ

2

Используйте existingJob вместо model.Job, чтобы добавить новый JobNote:

existingJob.JobNotes.Add(...); 

Когда SaveChanges называется EF обнаруживает новую ноту (на основе уже прилагается existingJob) и добавить его в контекст, а затем вставить в базу данных.

Вам не нужно, кстати, включать существующие примечания в эту процедуру, таким образом вы можете удалить .Include(x => x.JobNotes).

+0

Отлично, спасибо – Evonet

Смежные вопросы