ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。...
发布日期:2021-11-09 22:51:12 浏览次数:19 分类:技术文章

本文共 2103 字,大约阅读时间需要 7 分钟。

出现问题的显示:

一,我们来探究下这问题出现的原因:

报错代码块,如下

UserInfo us = _iuserInfoBll.GetById("E501BE1F-07CA-4B5F-9801-02862B41AD8B");us.NickName = "123132"; _iuserInfoBll.Update(us);

查询方法

public virtual T GetById(string id){      return _dbset.Find(id);}

更新方法:

public virtual void Update(T entity)        {            _dbset.Attach(entity); //这里报错            DataContext.Entry(entity).State = EntityState.Modified;            _dataContext.SaveChanges();        }

根据上面我们发现,出现的原因是:我们先执行了查询操作,然后再执行更新操作,那为什么这样会出现问题?

查找下资料发现:这是由于查询之后的数据,EF默认帮我们缓存了起来,放在了DbContext上下文中,我们在修改的时候,执行dbset.Attach(entity);,发现缓存中已存在同一键值,所以会报这个错。

那我们的解决方法是什么呢?

一,在查询的方法中添加AsNoTracking(),不跟踪

List<Alldetails> all = db.Alldetails.AsNoTracking().Where(m => m.Brand == alldetails.Brand).ToList();

二,我们可以重写update方法,看我仓储中的update方法,是以虚方法定义的,则我们可以重写:

 

///Entity Framework中编辑时错误ObjectStateManager 中已存在具有同一键的对象        ///         /// 由于出现ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象,重写Update解决        ///         ///         /// 
public override void Update(UserInfo entity) { var query = DataContext.Set
().Find(entity.UserID); if (query != null) { DataContext.Entry
(query).State = EntityState.Detached; //这个是在同一个上下文能修改的关键 } query.Mobile = entity.Mobile; query.TrueName = entity.TrueName; query.Remark = entity.Remark; DataContext.Set
().Attach(query); DataContext.Entry(query).State = EntityState.Modified; DataContext.SaveChanges(); }

 三,根据上面的逻辑,我们是不是可以修改仓储的GetById方法?代码如下:

public virtual T GetById(Guid id)        {             T t = _dbset.Find(id);            DataContext.Entry
(t).State = EntityState.Detached; return t; }
public virtual T Get(Expression
> where) { return _dbset.AsNoTracking().Where(where).FirstOrDefault
(); }

而这也是通过的,通过查询状态和修改为不跟踪

综上:三种方法都可以结果这个问题

 

转载于:https://www.cnblogs.com/May-day/p/5379246.html

转载地址:https://blog.csdn.net/dcujcivw769565/article/details/101260411 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:本地Fiddler传递XML格式数据,调试微信功能。
下一篇:VS2013使用EF与mysql数据库.

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年03月23日 10时34分12秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

rn webview加载本地静态html,React Native - Webview 加载本地文件 2019-04-21
dax powerbi 生成表函数_Power BI |DAX函数のCALCULATETABLE、CALENDAR函数以及相关表生成函数... 2019-04-21
vscode 不能使用中文输入法_vscode中vim插件设置 2019-04-21
当集合a为空集时a的取值范围_1.1.2 集合间的基本关系 2019-04-21
vue 可合并表格组件_Vue实战046:详解Mixins混入使用和注意事项 2019-04-21
python包怎么做双重差分did分析_多变量相关性分析(一个因变量与多个自变量) 2019-04-21
fi sap 凭证冲销 稅_SAP中的成本要素 2019-04-21
mysql幻读是什么意思_MySQL中的幻读,你真的理解吗? 2019-04-21
mysql执行计划中性能最差的是_MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧... 2019-04-21
易语言执行mysql命令_易语言通过“打开”命令操作数据库 2019-04-21
mysql slave 1062_mysql主从同步slave错误1062 2019-04-21
mysql构造器_MySQL行构造器表达式优化(Row Constructor Expression) 2019-04-21
2008日志清理 server sql_SQL Server 2008 清除日志 2019-04-21
mac mysql root 权限_Mac平台重新设置MySQL的root密码 2019-04-21
mysql新增一列_MySQL-ProxySQL中间件 2019-04-21
mysql 30入门_30分钟带你快速入门MySQL教程 2019-04-21
kangle主机怎么配置MySQL_kangle web服务+easypanel主机控制面板快速搭建网站和数据库以及管理空间详细教程... 2019-04-21
mysql 翻页 存储过程_MySQl通用翻页(存储过程) 2019-04-21
2020word替换所有文本_Excel字符函数(5):REPLACE、SUBSTITUTE查找替换函数之区别... 2019-04-21
win10安装ipython_win10环境 ipython app.py 8080 这里为什么是ipython 这步无法启动 2019-04-21