博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Entity Framework中的Attached报错相关解决方案的总结
阅读量:6497 次
发布时间:2019-06-24

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
;
    
}
}

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

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

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

本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/5088521.html  ,如需转载请自行联系原作者

你可能感兴趣的文章
Java设置以及获取JavaBean私有属性进阶
查看>>
db2表结构导出导入,数据库备份
查看>>
策略模式
查看>>
OrderOnline——项目概述
查看>>
POJ-2739(Water)
查看>>
【转】第三节 UNIX文件系统结构
查看>>
为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录
查看>>
Angular7里面实现 debounce search
查看>>
Linux 内核链表
查看>>
git学习------>Git 分支管理最佳实践
查看>>
括号和出栈所有序列问题
查看>>
第一次操刀数据库分表的教训与经验
查看>>
录音声音小
查看>>
Ubuntu 12.04 安装 Chrome浏览器
查看>>
java 反射
查看>>
ORACLE物化视图(物理视图)
查看>>
android 读取json数据(遍历JSONObject和JSONArray)(转)
查看>>
UIScrollView中的手势
查看>>
递归和迭代的差别
查看>>
基于jquery的可拖动div
查看>>