如何使用MVC 2和EF 4保存更改?

时间:2011-05-02 17:30:21

标签: asp.net asp.net-mvc entity-framework asp.net-mvc-2

我正在使用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数据服务

2 个答案:

答案 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();
    }
}