ASP.NET MVC3更新出错:ObjectStateManager中已存在具有同一键的对象

程序代码:

[HttpPost]
public ActionResult Edit(Person person)
{
    if (ModelState.IsValid)
    {
        Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
        //TODO
        db.Entry(person).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(person);
}

上边代码试图在更新person到数据库前取出旧数据(oldperson)进行文件删除等操作,结果页面报错:

引用内容

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

若是不取旧数据,该段代码执行可以正常执行,经过一番测试,猜测原因是读取旧数据时,对象会被添加到db中,当执行"db.Entry(person)"时,试图把person也添加到db中,但person和先前添加对象的键值是一样的,因而报错,这也解释了为什么不取旧数据不出错。

下边提供三种解决方法:

Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
//TODO
oldperson.PicUrl = person.PicUrl;
db.SaveChanges();
Person oldperson = db.People.AsNoTracking().Where(p => p.Id == person.Id).FirstOrDefault();
//TODO
db.Entry(person).State = EntityState.Modified;
db.SaveChanges();
Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();
//TODO
db.Entry(oldperson).CurrentValues.SetValues(person);
db.SaveChanges();

参考资料

[1].An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

时间: 2024-10-18 14:48:12

ASP.NET MVC3更新出错:ObjectStateManager中已存在具有同一键的对象的相关文章

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象

程序代码 [HttpPost]public ActionResult Edit(Person person){    if (ModelState.IsValid)    {        Person oldperson = db.People.Where(p => p.Id == person.Id).FirstOrDefault();        //TODO        db.Entry(person).State = EntityState.Modified;        db.

Entity Framework5.0运行时错误ObjectStateManager 中已存在具有同一键的对象

EF写了个简单的框架,在把查询出来的数据修改回去时,报了ObjectStateManager 中已存在具有同一键的对象这样一个错误,寻寻觅觅终于找到了最终的解决方案. ObjectStateManager 中已存在具有同一键的对象.ObjectStateManager 无法跟踪具有相同键的多个对象. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.InvalidOperationExc

EF ASP.NET MVC 更新出错:ObjectStateManager中已存在具有同一键的对象

解决方案 /// <summary> /// 保存 /// </summary> /// <param name="g"></param> public static void DbSave(GROUP g) { if (g == null) { return; } if (YJdb.Entry(g).State == EntityState.Detached) { var set = YJdb.Set<GROUP>(); G

数据库中已存在名为 &#39;View_Business&#39; 的对象。

用EF框架+MCF,编译的时候出现:数据库中已存在名为 'View_Business' 的对象. 解决方案: 1.Enable-Migrations2.Add-Migration3.Update-Database -Verbose 进行数据库更新. 数据库中已存在名为 'View_Business' 的对象.

Asp.net mvc3的“从客户端中检测到有潜在危险的 Request.Form 值”问题解决

Asp.net mvc3的“从客户端(content_v=\",<p>\n\t<imgalt=\"\" src...\")中检测到有潜在危险的Request.Form 值”解决 在三个地方修改 1.     在Controller调用的方法上添加[ValidateInput(false)] [ValidateInput(false)] ublic ActionResult EventSave() 2.在对应的asp.net web页面上加上Vali

ASP.NET MVC3中Model验证

原文:ASP.NET MVC3中Model验证 概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验证. 本节我们就学习如何使用 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据模型中的各个字段的验证. 这些特性用于定义常见的验证模式,例如范围检查和必填字段.而 DataAnnotations 特性使 MVC 能够提供客户端和服务器验证检查,使

[转]在ASP.NET MVC3中使用EFCodeFirst 1.0

本文转自:http://kb.cnblogs.com/page/97003/ 作者: NinoFocus  来源: 博客园  发布时间: 2011-04-12 10:41  阅读: 11971 次  推荐: 11                   原文链接   [收藏] 1. 新建项目 打开VS2010,选择 文件>新建>项目,新建ASP.NET MVC3 Web 应用程序,我这里把它命名为Blog. 2. 编写实体类 对于一个博客,一下几个类应该是必须的吧: Post           

jQuery Uploadify在ASP.NET MVC3中的使用

1.Uploadify简介 Uploadify是基于jQuery的一种上传插件,支持多文件.带进度条显示上传,在项目开发中常被使用. Uploadify官方网址:http://www.uploadify.com/ 2.ASP.NET MVC3中的使用Uploadify 搭建ASP.NET MVC3解决方案如下图,其中使用到的Uploadify为3.1版本: 1>.简单示例 _Layout.cshtml代码: <!DOCTYPE html> <html> <head>

ASP.NET MVC3在Visual Studio 2010中的变化

在VS2010中新建一个MVC3项目可以看出与以往的MVC2发生了很明显的变化 1.ASP.NET MVC3必要的运行环境为.NET 4.0 (想在3.5用MVC3,没门!) 2.默认MVC3模板项目已集成 3.全新的Razor视图引擎 @{ ViewBag.Title = "Home Page"; } <h2>@ViewBag.Message</h2> <p> To learn more about ASP.NET MVC visit <a