博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
陷阱~EF中的Update与Insert共用一个数据上下文
阅读量:7289 次
发布时间:2019-06-30

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

事情是这样的,有一个列表,里面有很多用户信息,可能会有重复的用户,将这个列表的用户插入到数据表中,如果用户已经存在,就更新这个用户的FillTimes 字段,让它加1,使用的底层ORM是entity frameworks4。

这是方法的大概内容

var user_Account = iC_User_Account.Find(i => i.UserID == u.UserID);            if (user_Account == null)            {                iRepository.Insert(new C_User_Account                 {                    AccountID = 1,                    AddTime = rechargeTime,                    BeginDate = rechargeTime,                    EndDate = rechargeTime.AddYears(100),                    FillTimes = 1,                    Income = 0,                    Incoming = 0,                    LockMoney = 0,                    Outgoings = card.CardValue,                    Status = 1,                    UserID = u.UserID,                    UserType = 1,                });            }            else            {                            user_Account.FillTimes = user_Account.FillTimes ?? 0 + 1;                iRepository.Update(user_Account);            }

这个方法看似没有任何问题,当一个用户没有在表中存在,就insert,如果存在了,就update,这是再简单不过的逻辑了,然而,如果你的iRepository对象声明

放错了位置,可能问题就出来了,我们知道DbContext是有缓存的,当一个实体被提交后,它可能在缓存里还会存在,直到DbContext被dispose之后,它才会

消失,这就是说,如果insert与update使用的是同一个DbContext,就会出现一个异常,“不能在相同的对象上建立新实体”,而一般地,insert与update不能不同存在,这是我们可以想像的,而我们可能往往忽略了DbContext是否为一个,如果insert或者update之后,DbContext对象没有被销毁,那异常就会出现了。

而在本例中,iRepository的声明与实例化是在方法体外部完成的,而这个方法就是在被集合遍历时调用的,这时,你的iRepository里的DbContext对象就成了一个,在这个方法的生命周期时,你的数据上下文是一个,你的update操作也就出现问题了,呵呵。

//定义一个数据操作对象var iRepository=new Repository
();//供外部调用的更新用户列表的方法public void UpdateUser(List
list){ userList.ForEach(i=>{ InsertOrUpdateUser(i); });}

如果你的代码是这样写的话,那在遍历调用 InsertOrUpdateUser方法时,就有可能出现上面的异常了,呵呵!

正确的作法是将var iRepository=new Repository<User>();这句话移到InsertOrUpdateUser方法体里,问题就解决了。

转载于:https://www.cnblogs.com/lori/p/3267764.html

你可能感兴趣的文章
泛型简要原理
查看>>
poj 1254 Hansel and Grethel
查看>>
VirtualBox安装CentOS7
查看>>
Java豆瓣电影爬虫——抓取电影详情和电影短评数据
查看>>
如何让程序在后台执行
查看>>
bzoj3296[USACO2011 Open] Learning Languages*
查看>>
关于浮动元素对父元素高度的影响
查看>>
Mysql 关键字的优先级 分组 多表联查
查看>>
java 调用js
查看>>
iOS开发UI篇—Quartz2D使用(图形上下文栈)
查看>>
Oracle迁移MySQL笔记
查看>>
Building a Pub/Sub Message Bus with Wcf,Msmq,IIS
查看>>
Mybatis实现批量删除
查看>>
【leetcode】995. Minimum Number of K Consecutive Bit Flips
查看>>
【洛谷 P4886】 快递员 (点分治)
查看>>
在Ajax中将数组转换成字符串(0517-am)
查看>>
hive字符串函数
查看>>
【erlang ~ 4 days】 Day # 1.2 Sequential Programming
查看>>
HDFS Erasure Coding介绍
查看>>
abstract vs interface
查看>>