最近公司项目需要,想要给订单增加一个状态修改记录。

说起来很简单的需求,但是做的时候,卡了我半天。。。

问题描述:

修改订单状态保存之前的时候,需要判断,如果新状态不等于旧状态,才做记录,但是在底层的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整理的更多相关文章

  1. EntityFramework 实体拆分和表拆分

    之前有人问过 EF 如何进行实体拆分和表拆分?我记得当时认为不可能,理由忘记了,后来又有人发了一段配置截图,发现原来是可以的,不记录的东西容易忘掉,关于 EF 实体拆分和表拆分,下面是自己的一些整理. ...

  2. EntityFramework优缺点

    高层视图: 改变在现有系统使用EntityFramework的优势是什么? • All -in-1框架的类映射表,需要编写映射代码, 并且是很难维护的. • 可维护性,易于理解的代码,无需创造大的数据 ...

  3. EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

    官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...

  4. (转)EntityFramework之领域驱动设计实践

    EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...

  5. EntityFramework优缺点(转)

    Entity Framework  是微软推荐出.NET平台ORM开发组件, 现在已放源代码.  以下我们来讨论一下优缺点和一些问题, 以下简称EF.  有兴趣可查询官网的Entity Framewo ...

  6. vs2012加载EntityFrameWork框架,连接Oracel

    近日公司用到.net MVC框架做接口,需连接到Oracel数据库,从网上查阅了一些资料,当然,从咱们博客园获益匪浅.然后结合自己所做,把使用过程中遇到的一些问题,及如何解决的整理如下,方便查阅,也有 ...

  7. EntityFramework 6.x多个上下文迁移实现分布式事务

    前言 自从项目上了.NET Core平台用上了EntityFramework Core就再没碰过EntityFramework 6.x版本,目前而言EntityFramework 6.x是用的最多,无 ...

  8. 【ASP.NET Core分布式项目实战】(三)整理IdentityServer4 MVC授权、Consent功能实现

    本博客根据http://video.jessetalk.cn/my/course/5视频整理(内容可能会有部分,推荐看源视频学习) 前言 由于之前的博客都是基于其他的博客进行开发,现在重新整理一下方便 ...

  9. EntityFramework 实践 Overview

    使用EntityFramework,是微软出的一个轻量级ORM框架,对于做一些小型的项目非常方便,几乎是零配置,以及对linq的支持,所以非常的易于使用,虽然已经使用EntityFramework很久 ...

随机推荐

  1. Java中IO——NIO

    一.引入 当引入一些新功能的时候,那说明之前的设计可能还需要完善. 1.阻塞式 在传统的IO输入输出中,如果我们从流中去读数据,而数据源中没有数据时,程序就会阻塞该线程.阻塞式线程的一种基本状态,可以 ...

  2. 解决Mysql错误Too many connections的方法

    MySQL数据库 Too many connections出现这种错误明显就是 mysql_connect 之后忘记 mysql_close:当大量的connect之后,就会出现Too many co ...

  3. Chromium之文件类型

    .grp: Generate your project. 是由Json(JavaScript Object Notation)(or Python?)来解析,根据环境(OS,Compiler..)来生 ...

  4. Struts2监听Action结果的监听器

    作者:禅楼望月 在前面我们学到了在特定的Action中配置结果监听器,在Action完成控制处理之后,struts2转入实际的物理视图之前被回调.但是这种方式的缺点是,结果的监听器不能被复用.根据设计 ...

  5. RDMA

    什么是RDMA? 来源 https://blog.csdn.net/u011459120/article/details/78469098 1. 概述 RDMA是Remote Direct Memor ...

  6. [LOJ #2538][PKUWC 2018]Slay the Spire

    题目大意:一开始有 $2n$ 张牌,每张牌上都写着一个数字 $w_i$,有两种的牌,每种类型各 $n$ 张: 1.攻击牌:打出后对对方造成牌上的数字的伤害. 2.强化牌:打出后,设数字为 $x$,则其 ...

  7. Light OJ 1074:Extended Traffic(spfa判负环)

    Extended Traffic 题目链接:https://vjudge.net/problem/LightOJ-1074 Description: Dhaka city is getting cro ...

  8. D. Relatively Prime Graph

    Let's call an undirected graph G=(V,E)G=(V,E) relatively prime if and only if for each edge (v,u)∈E( ...

  9. codeforces902B. Coloring a Tree

    B. Coloring a Tree 题目链接: https://codeforces.com/contest/902/problem/B 题意:给你一颗树,原先是没有颜色的,需要你给树填色成指定的样 ...

  10. linux下将jpg,jpeg格式转为PDF

    1.安装imagemagick(用其中的convert)和gthumb     sudo apt-get install imagemagick gthumb 2.将tiff图片转换为png或jpeg ...