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);
    }

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...