2016-02-13 64 views
0

我有一個控制器操作,它在更改時將數據保存到db。模型包含子文件,但它們不會保存到數據庫中。數據來自服務器,文件從請求中添加到模型中,但它不會保存。沒有錯誤發生。實體框架不會在編輯時保存子文件

這是我的模型:

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)行。你知道如何解決這個問題嗎? –