博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Entity Framework中的Attached报错的完美解决方案终极版
阅读量:5345 次
发布时间:2019-06-15

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

之前发表过一篇文章题为《》,那篇文章确实能解决单个实体在进行更新、删除时Attached的报错,注意我这里说的单个实体,指的是要更新或删除的实体不包含其它实体(比如导航属性就包含其它实体),也就是简单POCO对象;但如果不是呢?那么那篇文章里的方法在一定程度上不起作用了,仍会报错,我开始也想不明白,明明通过IsAttached函数判断要更新的实体并未Attached,但进行Attaching时但仍然报错说有相同Key,开始还以为是MS的BUG,后经过多次反复调试发现,报错是对的,因为他报的错并不是我当前要更新的实体,而是该实体中关联的实体,代码与演示报错如下:(仅是演示代码)

public class A{   public string a{get;set;}   public string b{get;set;}   public string c{get;set;}   public virtual B b{get;set;}}public class B{   public string x{get;set;}   public string y{get;set;}   public string z{get;set;}}var a1= dbContext.Set().Single();a1.a="test1";dbContext.SaveChanges();dbContext.Detach(a1);//从缓存中移除a1实体;var a2= dbContext.Set().AsNoTracking().Single();a2.a="test2"; dbContext.Set().Attach(a2); //报错,说B相同的KEY已经有AttacheddbContext.Entry(entity).State = EntityState.Modified;dbContext.SaveChanges();

针对这个报错,我在想,为何查询实体A的时候能同时关联查询实体B并都同时Attached到内存中,而当我执行Detach实体A时,却没能关联Detach实体B,问题根源就在这里,知道这个原因了,现在就是要解决这个问题,如何解决呢?既然知道是Detach实体不全面造成的,那么我只需要获取到当前DbContext上下文对象中现有的所有已Attached实体,在执行完相应的CRUD时,再全部依次Detach掉即可,解决方案代码如下:

///         /// 清空DB上下文中所有缓存的实体对象        ///         private void DetachedAllEntities()        {            var objectContext = ((IObjectContextAdapter)this.baseContext).ObjectContext;            List
entries = new List
(); var states = new[] { EntityState.Added, EntityState.Deleted, EntityState.Modified, EntityState.Unchanged }; foreach (var state in states) { entries.AddRange(objectContext.ObjectStateManager.GetObjectStateEntries(state)); } foreach (var item in entries) { objectContext.Detach(item.Entity); } } public void Commit() //封装的统一提交方法 { this.baseContext.SaveChanges(); this.DetachedAllEntities();//执行清除 }

在使用的时候配合之前那篇文章的IsAttached函数就能完美解决所有的Attached报错问题了!

转载于:https://www.cnblogs.com/zuowj/p/4650781.html

你可能感兴趣的文章
巧用Win+R
查看>>
Python中的greenlet包实现并发编程的入门教程
查看>>
java中遍历属性字段及值(常见方法)
查看>>
YUI3自动加载树实现
查看>>
kettle导数到user_用于left join_20160928
查看>>
较快的maven的settings.xml文件
查看>>
随手练——HDU 5015 矩阵快速幂
查看>>
malloc() & free()
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
关于这次软件以及pda终端的培训
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
新手村之循环!循环!循环!
查看>>
线程安全问题
查看>>
linux的子进程调用exec( )系列函数
查看>>
MySQLdb & pymsql
查看>>
zju 2744 回文字符 hdu 1544
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>