关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法,欢迎一起探讨!

1.单个实体对象在进行改删时出现Attached报错,解决方案,请参见:

http://www.cnblogs.com/zuowj/p/4523075.html

http://www.cnblogs.com/scy251147/p/3688844.html

原理:清除context上本地缓存的与之相关联的实体对象

2.单个实体对象在进行改删时,其关联的其它实体对象属性(即:导航属性)出现Attached报错,解决方案,请参见:

http://www.cnblogs.com/zuowj/p/4650781.html

原理:清除context上本地缓存所有的实体对象

3.多个不同的实体对象进行改删时,其自身出错或其关联的其它实体对象属性(即:导航属性)出现Attached报错,解决方案,如下:

首先增加一个用于清除指定实体对象的context上本地缓存方法,如下:

        public void DetachHoldingEntities(params object[] entities)
{
var entries = context.ChangeTracker.Entries().Where(e => e.State != EntityState.Detached).ToList();
if (entities == null && entities.Length <= 0) return;
foreach (var entity in entities)
{
var entry = entries.SingleOrDefault(e => GetEntityKey(e.Entity).Equals(GetEntityKey(entity)));
if (entry != null && entry.Entity != null)
{
entry.State = EntityState.Detached;
}
}
} private EntityKey GetEntityKey(object entity)
{
try
{
var entityWrapper = entity.GetType().GetField("_entityWrapper").GetValue(entity);//获取字段_entityWrapper的值
var entityWrapperType = entityWrapper.GetType();//获取字段的类型 var entityKey = entityWrapperType.GetProperty("EntityKey").GetValue(entityWrapper, null);//获取EntityKey属性的值 return (EntityKey)entityKey;
}
catch
{
return null;
}
}

然后在进行改删前,调用上述清除方法清除指定的实体即可,示例代码如下:

ctx.DetachHoldingEntities(entity.TA_CWBankAccountInfo);
ctx.GetRepository<TA_CWTransferRequestInfo>().Update(entity);

当然还有一个比较简单的方法来避免上述错误,那就是:使用原生的DbContext进行增、删操作,更改则由DbContext的自动跟踪来进行处理,对于不是从DbContext查到的实体对象,若需要参与增删改时,请先进行Attach操作,否则都是来自于DbContext的实体对象则不需要再进行Attach。

关于Entity Framework中的Attached报错相关解决方案的总结的更多相关文章

  1. 关于Entity Framework中的Attached报错的完美解决方案终极版

    之前发表过一篇文章题为<关于Entity Framework中的Attached报错的完美解决方案>,那篇文章确实能解决单个实体在进行更新.删除时Attached的报错,注意我这里说的单个 ...

  2. 关于Entity Framework中的Attached报错的完美解决方案

    我们在使用Entity Framework进行CRUD时,为了提升查询效率,一般均会启动NoTracking,即不追踪变化,设置代码如下: //这是DB First模式下设置方法: aTestEnti ...

  3. Djianggo 在windows中安装出现报错的解决方案

    Djianggo 在win7下 安装会报错 Traceback (most recent call last):File "setup.py", line 4, in <mo ...

  4. 针对PIL中ImageDraw.py报错的解决方案

    linux mint 13开始就发现这个问题了,一直不知道怎么解决,今天突然发现了解决方案,来分享给大家 下面是修改对比,自己根据修改,这个是系统文件,需要root权限,路径/usr/lib/pyth ...

  5. python命令行中import caffe报错的解决方案

    1.ImportError: No module named skimage.io >>> import caffe Traceback (most recent call last ...

  6. 启动jemeter 报错相关解决方案

    1:当启动jemeter时报错"页面文件太小,无法完成操作" 如图: 是说明分配的内容不足,即可调整内存重启即可解决 1):打开:控制面板>系统和安全>系统 2):点击 ...

  7. Entity framework 中Where、First、Count等查询函数使用时要注意

    在.Net开发中,Entity framework是微软ORM架构的最佳官方工具.我们可以使用Lambda表达式在Entity framework中DbSet<T>类上直接做查询(比如使用 ...

  8. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  9. 解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...

随机推荐

  1. maven配置阿里云镜像

    编辑%maven_home%/conf/settings.xml文件,添加 <mirror> <id>aliyun-maven</id> <mirrorOf& ...

  2. 重量级Orchard模块发布 - 模块生成工具RaisingStudio.ModuleGenerator

    可以从这里下载安装(http://gallery.orchardproject.net/List/Modules/Orchard.Module.RaisingStudio.ModuleGenerato ...

  3. 使用JS或jQuery模拟鼠标点击a标签事件

    <a id="alink" href="abc.aspx"  style="visibility: hidden;">下一步&l ...

  4. Javascrpt无刷新文件上传

    最近工作中遇到上传文件问题,主要需求是一步点击上传,兼容ie8+,当时用的dojox/form/uploader控件,这两天扒了一下源码,明白了原理拿出来分享一下. 总体思路如下: 1.对于支持XML ...

  5. 一种集合“相等性”的实现

        最近在工作中遇到了一个小的功能,就是需要向一个服务发送请求命令,需要判断请求是否发生变化,如果发生变化了,则重新请求.该问题实际上就是判断两个集合是否相等,只需要记录最后一次请求的元素的集合, ...

  6. 根据BOM和已存在的文件生成文件列表

    在BOM中记录中有物料编码,物料名称,物料规格等,而且依据BOM已经生成了相应的文件,如采购规格书,检验规格书等,这个时候需要获得这些文件的标题,并且生成一个列表,可以使用下面的VBA代码,具体代码如 ...

  7. Python中的几种数据类型

    大体上把Python中的数据类型分为如下几类:   Number(数字) 包括int,long,float,complex String(字符串) 例如:hello,"hello" ...

  8. 内存角度探寻C++面向对象 之 继承、多态

    一,简单继承: #include <iostream> class TableTennisPlayer { private: int id; public: TableTennisPlay ...

  9. 去除NSString里面的空格

    NSString *password = @"12  34"; [password stringByTrimmingCharactersInSet:[NSCharacterSet ...

  10. 深入了解Java程序执行顺序

    Java中main方法,静态,非静态的执行顺序详解 Java程序运行时,第一件事情就是试图访问main方法,因为main相等于程序的入口,如果没有main方法,程序将无法启动,main方法更是占一个独 ...