2016-11-15 122 views
0

当提交表单并传递我的模型(Forms)时,我试图将更改保存到我的数据库。实体框架 - 保存数据库更改不起作用

表单模型有一个PeopleInvolved对象作为属性。

模型成功更新,更改也成功添加到peopleInvolved对象,但是,SaveChanges()调用不保存任何内容。

的.NET Framework 4.5.1 - EF 6.1.1

public class Forms 
{ 
     public int Id { get; set; } 
     public string UserId { get; set; } 
     public PeopleInvolved PeopleInvolved { get; set; }  
} 

public async Task<ActionResult> EditForm(Forms model, string returnUrl) 
{ 
    ViewData["ReturnUrl"] = returnUrl; 
    ApplicationUser user = await GetCurrentUserAsync(); 

    if (!ModelState.IsValid) 
     return RedirectToAction("Index", model); 

    if (model.PeopleInvolved != null) 
    { 
     PeopleInvolved peopleInvolved = _db.PeopleInvolved.Single(x => x.FormId == user.FormId); 
     peopleInvolved = model.PeopleInvolved; 

     _db.SaveChanges(); 

     return RedirectToLocal(returnUrl + "?PeopleInvolved?Success"); 
    } 
} 
+0

你们是不是要添加或更新? – Miguel

+0

我试图更新 - 理想情况下无需手动将每个属性分配给相应的模型属性。 –

回答

0

你可以这样更新。 如果必须用user.FormId覆盖model.PeopleInvolved.FormId更新该属性。

db.PeopleInvolved.Attach(model.PeopleInvolved); 
db.Entry(model.PeopleInvolved)).State = System.Data.Entity.EntityState.Modified;  
db.SaveChanges(); 
+0

真棒,工作的魅力 - 我已经尝试过这一点,但** **后我会检索到的行,以便是越来越重复的主键。 谢谢:D –

1

你实际上并没有改变从数据库中任何东西。

您对数据库调用返回一个PeopleInvolved对象,并存储在peopleInvolved变量的引用。然后,将该变量更改为模型对象上的PeopleInvolved属性的引用。你永远不会改变从数据库调用返回的对象。

简单的解决方案是像做

peopleInvolved.Property1 = model.PeopleInvolved.Property1; 
peopleInvolved.Property2 = model.PeopleInvolved.Property2; 

,以更新从数据库返回的实际对象。

+0

ARGH你完全正确!我试图绕过分配每个属性。谢谢! –