asp.net-mvc-3 – 带有EF 4.1和EntityState.Modified的MVC3

使用MVC3更新对象

我有一个可以修改的模型,请看下面的示例:

[HttpPost]
public ActionResult Edit(Company c)
{
       if (ModelState.IsValid)
       {
           db.Entry(c).State = EntityState.Modified;
           db.SaveChanges();
           return RedirectToAction("Index");
       }
       return View(c);
}

该模型具有未在视图中显示的其他字段,并且不能由用户修改,但是当我单击提交按钮时,未在视图中显示的字段设置为null.

我可以以某种方式让EF知道不修改某些字段吗?谢谢.

解决方法

通常最好不要直接绑定到实体对象,而是创建一个编辑模型并绑定到该模型.

毕竟…什么是阻止有人发布回来的价值你不想用这种方法改变?

这里的主要问题是mvc模型绑定在上下文之前更改模型中的属性,因此实体框架不知道哪些值已更改(因此应更新哪些值)

您已经使用db.Entry(c)稍微减轻了这一点.State = EntityState.Modified;但这告诉实体框架整个记录已经更新.

我通常会做以下事情:

>首先绑定到专门用于此控制器的模型
>创建要更新的实体类的实例,相应地设置Id并将其附加到上下文
>将实体上的属性更新为与绑定到的模型相同(对象已附加,因此实体框架正在跟踪现在正在更改的列)
> SaveChanges

第3步有点乏味,因此考虑使用像automapper这样的工具来简化操作

编辑:

[HttpPost]
    public ActionResult Edit(Company c)
    {
        if (ModelState.IsValid)
        {
            Company dbCompayObjct = new Company { companyId = c.companyId };
            db.Company.Attach(dbCompayObjct);

            dbCompanyObjct.CompanyName = c.CompanyName;
            dbCompanyObjct.City = c.City;

            db.SaveChanges();

            return RedirectToAction("Index");
        } 
        return View(c);
    }

相关文章

ASP.NET与IIS是紧密联系的,由于IIS6.0与IIS7.0的工作方式的...
在之前的ASP.NET是如何在IIS下工作的这篇文章中介绍了ASP.NE...
这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...