如何在ASP.NET MVC 3中更新EF 4实体?

Jas*_*ans 7 entity-framework-4 asp.net-mvc-3

我有2个项目 - 一个包含EDM实体框架模型和单独的ASP.NET MVC项目的类库.

我在使用MVC编辑和保存对实体的更改时遇到了问题.在我的控制器中我有:

public class UserController : Controller
    {
        public ActionResult Edit(int id)
        {
            var rep = new UserRepository();

            var user = rep.GetById(id);

            return View(user);
        }

        [HttpPost]
        public ActionResult Edit(User user)
        {
            var rep = new UserRepository();

            rep.Update(user);

            return View(user);
        }
    }
Run Code Online (Sandbox Code Playgroud)

UserRepository有一个像这样的Update方法:

public void Update(User user)
{
     using (var context = new PDS_FMPEntities())
     {
         context.Users.Attach(testUser);
         context.ObjectStateManager.ChangeObjectState(testUser, EntityState.Modified);
         context.SaveChanges();
     }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我在编辑用户页面上单击"保存"时,该参数user仅包含两个填充的值:Id和FirstName.我认为这是因为我只在视图中显示这两个属性.

我的问题是,如果我正在更新用户的名字,然后想要保存它,我想对User视图中未显示的其他属性做什么,因为它们现在在user对象中包含0或NULL值?

我一直在阅读很多关于使用存根实体的内容,但是我无法快速完成,因为我见过的所有例子都没有.即我不断获得与EntityKey相关的异常.

有人能指出我如何使用由MVC前端调用的存储库类更新EF 4实体的好教程/示例吗?

Jas*_*ans 1

好吧,经过一番尝试和错误,我看起来找到了解决方案。这是我的更新Update方法UserRepository

public void Update(User user)
{
    using (this.Context)
    {
        var tempUser = new User { usr_id = user.usr_id };

        this.Context.Users.Attach(tempUser);
        this.Context.ApplyCurrentValues("Users", user);
        this.Context.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的其他一些例子与上面的非常接近,但只是没有达到目标。

  • @Jason Evans - 这被称为存根技术,仅适用于标量属性。如果您在视图中绑定了诸如“User.Addresses”之类的导航属性,则上述内容不会更新地址。我建议您再次从数据库中检索用户,然后使用“TryUpdateModel”来更新对象。请参阅我最近的问题/答案以获取更多信息:http://stackoverflow.com/questions/4653834/asp-net-mvc-ef4-poco-repository-how-to-update-relationships/4666466#4666466 (2认同)