事情是这样的,有一个列表,里面有很多用户信息,可能会有重复的用户,将这个列表的用户插入到数据表中,如果用户已经存在,就更新这个用户的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 = ,
AddTime = rechargeTime,
BeginDate = rechargeTime,
EndDate = rechargeTime.AddYears(),
FillTimes = ,
Income = ,
Incoming = ,
LockMoney = ,
Outgoings = card.CardValue,
Status = ,
UserID = u.UserID,
UserType = ,
});
}
else
{ user_Account.FillTimes = user_Account.FillTimes ?? + ;
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<User>(); //供外部调用的更新用户列表的方法
public void UpdateUser(List<User> list)
{
userList.ForEach(i=>{
InsertOrUpdateUser(i);
});
}

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

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

陷阱~EF中的Update与Insert共用一个数据上下文的更多相关文章

  1. 在EF中使用原生SQL,首先要创建上下文对象

    using (var db = new Entities()) { //数据操作 } 新增 string sql = "insert into UserInfo values('zhangs ...

  2. EF中的transaction的使用范例

    注意一点: 在EF中使用事物后,对于一个新增的model,在saveChanges后,可以得到该实体的自增ID,但在提交事物之前, 该数据并没有真正的新增到DB中,但此时可以得到model新增的自增I ...

  3. ABP Framework:移除 EF Core Migrations 项目,统一数据上下文

    原文:Unifying DbContexts for EF Core / Removing the EF Core Migrations Project 目录 导读:软件开发的一切都需要平衡 动机 警 ...

  4. 在Sql Server触发器中判断操作是Insert还是Update还是Delete

    在Sql Server触发器中判断操作是Insert还是Update还是Delete DECLARE    @IsInsert bit,    @IsUpdate bit,    @IsDelete  ...

  5. EF4.1: Add/Attach and Entity States(EF中的实体状态转换说明)

    实体的状态,连接以及 SaveChanges 方法 数据库上下文对象维护内存中的对象与数据库中数据行之间的同步.这些信息在调用 SaveChanges方法被调用的时候使用.例如,当使用 Add 方法传 ...

  6. Entity Framework入门教程(3)---EF中的上下文简介

    1.DbContext(上下文类) 在DbFirst模式中,我们添加一个EDM(Entity Data Model)后会自动生成一个.edmx文件,这个文件中包含一个继承DbContext类的上下文实 ...

  7. easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)

    easyui datagrid 禁止选中行   没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...

  8. EF中使用UnitOfWork

    前言 关于EF5中使用UnitWork,参见另一博文:  https://www.cnblogs.com/masonblog/p/9801162.html 每次提交数据库都会打开一个连接,造成结果是: ...

  9. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

随机推荐

  1. Caffe学习系列(8):solver优化方法

    上文提到,到目前为止,caffe总共提供了六种优化方法: Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: &q ...

  2. 信息安全系统设计基础exp_5

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础 班级:1353 姓名:郑伟.吴子怡 学号:20135322.20135313 指导教师: 娄嘉鹏 实验 ...

  3. threejs构建web三维视图入门教程

    本文是一篇简单的webGL+threejs构建web三维视图的入门教程,你可以了解到利用threejs创建简单的三维图形,并且控制图形运动.若有不足,欢迎指出. 本文使用的框架是three.js gi ...

  4. 简单统计SQLSERVER用户数据表大小(包括记录总数和空间占用情况)

    在SQLSERVER,简单的组合sp_spaceused和sp_MSforeachtable这两个存储过程,可以方便的统计出用户数据表的大小,包括记录总数和空间占用情况,非常实用,在SqlServer ...

  5. node 大牛的blog

    node一些基本的核心包的使用  http://cnodejs.org/topic/548e53f157fd3ae46b2334fd node的基本的三种框架的比较  http://cnodejs.o ...

  6. [bzoj 1064][NOI2008]假面舞会(dfs判断环)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的 ...

  7. [工具]推荐一款查看dll依赖工具

    引言 很久没写一篇像样的博客了,最近一个月一直忙于项目,也没时间去总结了,回到家,也就是看看书,没怎么总结.不过还是挺兴奋的,每天过得还算充实.这里也算是对五月份的一个总结吧. 为什么要查看dll 因 ...

  8. 阿里面试回来,想和Java程序员谈一谈(转载)

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  9. 第一个windows程序设计

    #include <windows.h> int WINAPI WinMain(HINSTANCE hinstabce, HINSTANCE prvhinstace, PSTR icmdL ...

  10. 使用GitHub进行团队合作

    原文: Team Collaboration With GitHub GitHub已经成为的一切开放源码软件的基石.开发人员喜欢它,基于它进行协作,并不断通过它开发令人惊叹的项目.除了​​代码托管,G ...