gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:10:52 25 4
gpt4 key购买 nike

使用 MVC3 更新对象

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

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

该模型有其他字段未显示在 View 中,用户无法修改,但是当我单击提交按钮时, View 中未显示的字段设置为 null。

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

最佳答案

通常最好不要直接绑定(bind)到实体对象,而是创建一个编辑模型并绑定(bind)到它。

毕竟.. 什么可以阻止某人发回您不想用这种方法改变的值?

这里的主要问题是 mvc 模型绑定(bind)在上下文中更改模型中的属性,因此 Entity Framework 不知道哪些值已更改(因此应该更新哪些值)

您已经使用 db.Entry(c).State = EntityState.Modified; 稍微缓解了这种情况但这会告诉 Entity Framework 整个记录已更新。

我通常会执行以下操作:

  • 首先绑定(bind)到专门为此 Controller 的模型
  • 创建要更新的实体类的实例,相应地设置 Id 并将其附加到上下文
  • 将实体上的属性更新为与您绑定(bind)到的模型相同(对象已附加,因此 Entity Framework 正在跟踪正在更改的列)
  • 保存更改

  • 第 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-mvc-3 - 带有 EF 4.1 和 EntityState.Modified 的 MVC3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393532/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com