EntityFramework整理
最近公司项目需要,想要给订单增加一个状态修改记录。
说起来很简单的需求,但是做的时候,卡了我半天。。。
问题描述:
修改订单状态保存之前的时候,需要判断,如果新状态不等于旧状态,才做记录,但是在底层的Repository里写判断的时候,获取的状态始终相同,并没有能获取到数据库的最新数据。
问题调查:
经过研究和试验,发现这个ef的特殊机制。
就是服务器经过单实例操作后,所有的客户端使用的数据集是一个,虽然是new出来的实例,但是只是开了一个线程而已。所以所有人用的都是一个数据集(一个DBContainer)。
/// <summary>
/// 获取当前线程的数据上下文
/// </summary>
/// <returns>数据上下文</returns>
public static DBContainer CurrentContext()
{
DBContainer _nContext = CallContext.GetData(ConfigPara.EFDBConnection) as DBContainer;
if (_nContext == null)
{
_nContext = new DBContainer();
CallContext.SetData(ConfigPara.EFDBConnection, _nContext);
}
return _nContext;
}
那么这里的数据就有个说法了。
public virtual bool Edit(T model)
{
if (db.Entry<T>(model).State == EntityState.Modified)
{
int i = ;
try
{
i = db.SaveChanges();
}
catch (Exception ex)
{
return false;
}
return i > ;
}
else if (db.Entry<T>(model).State == EntityState.Detached)
{
try
{
db.Set<T>().Attach(model);
db.Entry<T>(model).State = EntityState.Modified;
}
catch (InvalidOperationException)
{
//T old = Find(model._ID);
//db.Entry<old>.CurrentValues.SetValues(model);
return false;
}
return db.SaveChanges()>;
}
return false;
}
数据的修改,创建最终调用的方法是db.savechanges(),也就意味着,所有的改动,都是先存放在这个container对象中,这里有个大的set。只要调用了db.savechanges(),自然会把所有的改动一起提交。
所以这里的问题是想判断新保存的状态和原状态是否相同的时候,就不能使用这一个container了。
解决办法
在需要判断的地方,重新new一个container出来
//这里必须这么写,不然的话,用获取的那个ef实体,得到的集合里的这个对象已经是改变的了,虽然没保存
DBContainer dBContainer = new DBContainer();var order = (from r in dBContainer.PaasOLT_Order
where r.Id == model.Id
select r).First();
这种方法获取出来的实体就是一个新的了,不受原来的container的约束了。自然可以获取到最新的数据库的数据了。
EntityFramework整理的更多相关文章
- EntityFramework 实体拆分和表拆分
之前有人问过 EF 如何进行实体拆分和表拆分?我记得当时认为不可能,理由忘记了,后来又有人发了一段配置截图,发现原来是可以的,不记录的东西容易忘掉,关于 EF 实体拆分和表拆分,下面是自己的一些整理. ...
- EntityFramework优缺点
高层视图: 改变在现有系统使用EntityFramework的优势是什么? • All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的. • 可维护性,易于理解的代码,无需创造大的数据 ...
- EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...
- (转)EntityFramework之领域驱动设计实践
EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...
- EntityFramework优缺点(转)
Entity Framework 是微软推荐出.NET平台ORM开发组件, 现在已放源代码. 以下我们来讨论一下优缺点和一些问题, 以下简称EF. 有兴趣可查询官网的Entity Framewo ...
- vs2012加载EntityFrameWork框架,连接Oracel
近日公司用到.net MVC框架做接口,需连接到Oracel数据库,从网上查阅了一些资料,当然,从咱们博客园获益匪浅.然后结合自己所做,把使用过程中遇到的一些问题,及如何解决的整理如下,方便查阅,也有 ...
- EntityFramework 6.x多个上下文迁移实现分布式事务
前言 自从项目上了.NET Core平台用上了EntityFramework Core就再没碰过EntityFramework 6.x版本,目前而言EntityFramework 6.x是用的最多,无 ...
- 【ASP.NET Core分布式项目实战】(三)整理IdentityServer4 MVC授权、Consent功能实现
本博客根据http://video.jessetalk.cn/my/course/5视频整理(内容可能会有部分,推荐看源视频学习) 前言 由于之前的博客都是基于其他的博客进行开发,现在重新整理一下方便 ...
- EntityFramework 实践 Overview
使用EntityFramework,是微软出的一个轻量级ORM框架,对于做一些小型的项目非常方便,几乎是零配置,以及对linq的支持,所以非常的易于使用,虽然已经使用EntityFramework很久 ...
随机推荐
- ps aux 和ps -aux和 ps -ef的选择
转载自:足至迹留 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想 ...
- React & shit Antd
React & shit Antd https://ant.design/components/tooltip-cn/ https://ant.design/components/tag-cn ...
- NOIP模板
快排 procedure qsort(l,r:longint); var i,j,t,m:longint; begin i:=l; j:=r; m:=a[(i+j) ]; repeat while a ...
- IIS注册asp.net4.0
1. 运行->cmd 2. cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319 3. aspnet_regiis.exe -i
- 强大的JQuery数组封装使用
JQuery对数组的处理非常便捷并且功能强大齐全,一步到位的封装了很多原生js数组不能企及的功能.下面来看看JQuery数组的强大之处在哪. $.each(array, [callback]) 遍历 ...
- Linux下只允许用户远程scp
本文将介绍在Linux环境下,让用户不能远程登录 只能使用scp命令 使用到的软件:rssh(http://pizzashack.org/rssh/index.shtml ) 环境:centos6.x ...
- CSS选择器及CSS3新增选择器
转自:http://www.cnblogs.com/libingql/p/4375354.html 1. CSS1定义的选择器 选择器 类型 说明 E 类型选择器 选择指定类型的元素 E#id ID选 ...
- Matlab xpC启动盘
要点: 1.target PC的网卡支持类型有限: 2.网上所列教程未必适用于本地,仅以两图表示: a,带有图形界面时容易出错: b,启动选项为Removable Device:
- COGS2642 / Bzoj4590 [Shoi2015]自动刷题机
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 906 Solved: 321 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了 ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...