2016-02-13 65 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)行。你知道如何解决这个问题吗? –