我正在使用MVC 2和EF4。创建或删除对象有效,但更新没有。 我已经在StackOverflow上阅读了很多很多教程/问题,但我还没有找到一个真正的WORKING代码可以在我的“编辑”方法中使用。
[HttpPost]
public ActionResult Edit(int id, Account model)
{
try
{
Account accountEdited = accountRepository.Get(id);
// Working code to update "accountEdited" with "model"'s values ???
accountRepository.Save();
return RedirectToAction("Details", new { id = id });
}
catch (Exception ex)
{
return View();
}
}
我正在使用实体框架与WCF数据服务
答案 0 :(得分:3)
这就是我的所作所为:
[HttpPost]
public ActionResult Edit(int id, Account model)
{
try
{
Account accountEdited = accountRepository.Get(id);
TryUpdateModel(accountEdited);
ctx.SaveChanges();
return RedirectToAction("Details", new { id = id });
}
catch (Exception ex)
{
return View();
}
}
对存储库的初始调用将确保实体位于图形中,处于未修改状态。然后,MVC内置的TryUpdateModel
方法将两个对象合并在一起(accountEdited
对象,以及已经模型绑定的表单发布数据)。
这将导致实体处于Modified
状态。
只需在对象上下文中调用SaveChanges()
,然后将更改推送到数据库。
我已经涉足了诸如“存根技术”之类的技术,但它引入了一个痛苦的世界(主要与关系有关),所以这是最简单的方法,而且效果很好。
HTH
答案 1 :(得分:1)
您从您发布的代码中抽象出您的真实EF作品。这是最简单的EF保存:
public void Save(Account account)
{
using (DBContext ctx= new DBContext ())
{
ctx.Attach(account);
ctx.SaveChanges();
}
}
如果在另一个上下文中获取了对象,则只需附加该对象。如果没有,你可以这样做:
public void Save(int AccountID)
{
using (DBContext ctx= new DBContext ())
{
Account account = ctx.Account.Single(a => a.ID == AccountID)
account.property = somepropchange;
ctx.SaveChanges();
}
}