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

EF写了个简单的框架,在把查询出来的数据修改回去时,报了ObjectStateManager 中已存在具有同一键的对象这样一个错误,寻寻觅觅终于找到了最终的解决方案。

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。 
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同

键的多个对象。

网上有资料说是这样先改成未附加状态db.Entry(entity).State = EntityState.Detached,再进行修改。但是我是在基类里面写的方法,传过来的泛型的T,而且我没有把所有的Model都继承自BaseModel,因此T中拿不到主键,也就没办法去数据库中Find这个对象,直接更改更改后的实体对象的状态依然会报错。

所以,这个方法行不通。那只能另想办法了,查找资料之后发现,这是由于查询之后的数据,EF默认帮我们缓存了起来,放在了DbContext上下文中,我们在修改的时候,需要执行操作db.Entry(entity).State = EntityState.Modified;  需要再次的向上下文中附加该实体时候,EF发现该实体已经附加过了,所以会报这个错。所以自然也就有了解决办法。

解决方法,在查询的时候加上asNoTracking() 即可。。。这样,EF就不会缓存查询出来的对象了!


Update方法照样这样写:

 public virtual bool Update(T entity)
        {
          db.Entry(entity).State = EntityState.Modified;
            return true;
        }

  

时间: 2024-12-21 09:18:15

Entity Framework5.0运行时错误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.

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 RedirectT

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' 的对象.

Entity Framework 出现 &quot;此 ObjectContext 实例已释放,不可再用于需要连接的操作&quot; 的错误

原因 Entity的导航属性在View中使用,但是该Entity所在的Context已经在Controller中通过 using 释放掉:但是Entity又具有Deferred Query Evaluation性质,因此,导航属性对象没有被加载,从而出现上述错误. 解决方案 解决方法一:How to: Explicitly Load Related Objects 禁用Context的Deferred Query Evaluation,然后在查询结束后手动加载所有需要的导航属性 context.

(网上搜集)金蝶报错:名称或代码在系统中已被使用

KIS专业版 --修正核算项目关系 select * from t_itemdetail exec sp_cleanitemdetailv GO update a set a.fdetailcount=b.Fcount from t_itemdetail a join (select Fdetailid,count(*) as Fcount from t_itemdetailv where fitemid=-1 group by Fdetailid) b on a.fdetailid=b.fde

千呼万唤岂出来,写款软件不容易——Visual Entity 2.0 发布

在各位用户不继的催更中,终于完成了这次更新.Visual Entity这个软件发布于 2011年,这个软件完成后,便上班去了,也没有做什么推广工作.所以知道的用户并不多,尽管它是个非常好用.并且免费的软件.它是一个支持 NHibernate 和 Linq to SQL 的实体设计器,关于它的介绍,大家可以看:http://www.cnblogs.com/ansiboy/archive/2011/03/14/1983754.html . 随着 Visual Studio 的不断升级,但是旧版的 V

利用Entity Framework修改指定字段中的值

利用Entity Framework修改指定字段中的值一般我们编辑某些模型的时候会用到类似这样的代码: [HttpPost] public ActionResult Edit(Article model) { if (model.Id == 0) { return HttpNotFound(); } using (db) { db.Entry(model).State = EntityState.Modified; db.SaveChanges(); } return RedirectToAct

android/java 根据当前时间判断股票交易状态(未开盘 交易中 休市中 已收盘)

1 /** 2 * @param data yyyy-MM-dd HH:mm:ss 时间 3 * @return 未开盘 交易中 休市中 已收盘 4 */ 5 public static String getSotckStatus(String data) { 6 String s = ""; 7 try { 8 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 9 Date da