2016-02-13 2 views
0

У меня есть действие контроллера, которое сохраняет данные в db при изменении. Модель включает в себя дочерние файлы, однако они не сохраняются в базе данных. Данные поступают нормально с сервера, файл добавляется в модель из запроса ok, но он просто не будет сохранен. Происходит ошибка.Entity Framework не сохраняет детей при редактировании

Это мои модели:

public class Guest 
{ 
    public Guest() 
    { 
     this.Files = new List<File>(); 
    } 

    public int Id { get; set; } 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 

    public string Email { get; set; } 
    public string Tel { get; set; } 
    public int CompanyId { get; set; } 
    public int Votes { get; set; } 

    public virtual ICollection<File> Files {get; set;} 
} 

Это мой VM

public class GuestViewModel 
{ 
    public Guest Guest { get; set; } 
    public IEnumerable<SelectListItem> Companies { get; set; } 
} 

и это контроллер

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(GuestViewModel guestViewModel, HttpPostedFileBase upload) 
    { 

     if (upload != null && upload.ContentLength > 0) 
     { 
      var avatar = new File 
      { 
       FileName = System.IO.Path.GetFileName(upload.FileName), 
       FileType = FileType.Picture, 
       ContentType = upload.ContentType 
      }; 
      using (var reader = new System.IO.BinaryReader(upload.InputStream)) 
      { 
       avatar.Content = reader.ReadBytes(upload.ContentLength); 
      } 
      guestViewModel.Guest.Files = new List<File> { avatar }; 
     } 

     if (ModelState.IsValid) 
     { 

       Guest guest = new Guest(); 
       guest = guestViewModel.Guest; 
       _db.Entry(guest).State = EntityState.Modified; 
       _db.SaveChanges(); 
       return RedirectToAction("Index"); 

     } 
     return View(guestViewModel); 
    } 

Любая помощь приветствуется.

ответ

1

Я думаю, что вы должны установить состояние для дочерних сущностей, потому что, когда вы присоединяете объект к контексту, устанавливая состояние напрямую, любые дочерние сущности приступают к «неизменному» состоянию, поэтому игнорируются при сохранении изменений ,

В этом случае добавляется состояние, которое необходимо использовать для дочерних файлов.

Надеюсь, это поможет!

+0

Привет, да. Это помогает, если я укажу '_db.Entry (guest) .State = EntityState.Modified;' сразу после того, как я добавил файл для моделирования, он сохраняется. Однако, если я хочу изменить текущий файл и назначить EntityState.Modified, это приведет к ошибке на '_db.SaveChanges();' заявив, что я изменил (0) строки. Вы знаете, как это преодолеть? –

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