加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 04:19:11 所属栏目:asp.Net 来源:网络整理
导读:使用MVC3更新对象 我有一个可以修改的模型,请看下面的示例: [HttpPost]public ActionResult Edit(Company c){ if (ModelState.IsValid) { db.Entry(c).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); } return View(c
使用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);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读