Entity Framework细节追踪
小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03
< hr />
为了加深对EF特性的了解,so,写了一些测试代码。测试结果也许对实际项目没什么用处,但是对理解EF的相关机制还是有一定帮助的。本文可能会不定期更新(加入新的测试用例=。=)。
一、事务
直接看代码。
1、所有SaveChange包裹在一个TransactionScope里面。
1 [TestMethod]
2 public void TestMethod1()
3 {
4 using (var entities = new SysProcessEntities())
5 {
6 using (TransactionScope scope = new TransactionScope())
7 {
8 try
9 {
10 var test = entities.SysUser.Where(o => o.OrganizationID == 1).ToList();
11 var test2 = entities.SysRole.ToList();
12
13 test[0].Code = "admin1";
14 test2[0].Name = "dddd";
15 entities.SaveChanges();
16
17 test[0].Code = "admin";
18 test2[0].Name = "全功能";
19 entities.SaveChanges();
20
21 scope.Complete();
22 }
23 catch (Exception e)
24 {
25
26 }
27 }
28 }
29 }
结果:

2、在1的基础上去掉TransactionScope
1 [TestMethod]
2 public void TestMethod1()
3 {
4 using (var entities = new SysProcessEntities())
5 {
6 var test = entities.SysUser.Where(o => o.OrganizationID == 1).ToList();
7 var test2 = entities.SysRole.ToList();
8
9 test[0].Code = "admin1";
10 test2[0].Name = "dddd";
11 entities.SaveChanges();
12
13 test[0].Code = "admin";
14 test2[0].Name = "全功能";
15 entities.SaveChanges();
16 }
17 }
结果:

3、注释掉2的第9行和第13行,检查单独的一条语句是否自带事务。
1 [TestMethod]
2 public void TestMethod1()
3 {
4 using (var entities = new SysProcessEntities())
5 {
6 var test = entities.SysUser.Where(o => o.OrganizationID == 1).ToList();
7 var test2 = entities.SysRole.ToList();
8
9 //test[0].Code = "admin1";
10 test2[0].Name = "dddd";
11 entities.SaveChanges();
12
13 //test[0].Code = "admin";
14 test2[0].Name = "全功能";
15 entities.SaveChanges();
16 }
17 }
结果:

4、直接写Sql-"update [SysProcess].[dbo].[SysRole] set [name]='全功能' where ID=1",在查询分析器中执行,结果:

5、将1改为跨数据库
1 [TestMethod]
2 public void TestMethod1()
3 {
4 using (TransactionScope scope = new TransactionScope())
5 {
6 try
7 {
8 using (var entities = new SysProcessEntities())
9 {
10 var test = entities.SysUser.Where(o => o.OrganizationID == 1).ToList();
11 var test2 = entities.SysRole.ToList();
12
13 test[0].Code = "admin1";
14 test2[0].Name = "dddd";
15 entities.SaveChanges();
16
17 test[0].Code = "admin";
18 test2[0].Name = "全功能";
19 entities.SaveChanges();
20 }
21 using (var entities = new DistributionEntities())
22 {
23 var test = entities.VIPCard.ToList();
24 test[0].Sex = true;
25 entities.SaveChanges();
26 }
27
28 scope.Complete();
29 }
30 catch (Exception e)
31 {
32 string msg = e.Message;
33 }
34 }
35 }
结果:

于是整个世界美好了……
二、AsNoTracking
注意AsNoTracking要写在最终返回数据的那行代码中才有用,看代码:
[TestMethod]
public void TestMethod9()
{
using (var entities = new SysProcessEntities())
{
var ubs = entities.UserBrand.AsNoTracking();
).AsNoTracking();
var brands = from ub in ubs
from ob in obs
where ub.BrandID == ob.BrandID
select ub.BrandID;
var test = entities.ProBrand.Where(b => brands.Contains(b.ID)).ToList();
Assert.AreEqual(EntityState.Detached, entities.Entry(test[]).State);
}
}
结果:
so,using之中应该这么写:
var ubs = entities.UserBrand;
);
var brands = from ub in ubs
from ob in obs
where ub.BrandID == ob.BrandID
select ub.BrandID;
var test = entities.ProBrand.Where(b => brands.Contains(b.ID)).AsNoTracking().ToList();
Assert.AreEqual(EntityState.Detached, entities.Entry(test[]).State);
三、DbSet.Local
继续看代码:
1、
public void TestMethod10()
{
var entities = new SysProcessEntities();
var t1 = entities.ProBoduan.ToList();
var t2 = entities.ProBoduan.ToList();
Assert.AreEqual(t1[],t2[]);
}
大家以为t1[0]是否等于t2[0]?答案是true。可是作为引用类型,我并没有重载它的Equals方法,照理应该为false才对呀。修改下测试代码:
public void TestMethod10()
{
var entities = new SysProcessEntities();
var t1 = entities.ProBoduan.ToList();
var t2 = entities.ProBoduan.ToList();
].Name;
t1[].Name = "随便取个名用来测试";
Assert.AreEqual(name, t2[].Name);
}
结果:
。可知,t1[0]和t2[0]指向的是同一个对象,即t1和t2指向同一个数组地址,也就是entities.ProBoduan.Local指向的地址。不过数据库中,仍执行了两次取数操作。
2、then,加入AsNoTracking试试看:
public void TestMethod10()
{
var entities = new SysProcessEntities();
var t1 = entities.ProBoduan.AsNoTracking().ToList();
var t2 = entities.ProBoduan.AsNoTracking().ToList();
].Name;
t1[].Name = "随便取个名用来测试";
Assert.AreEqual(name, t2[].Name); //true,t1的更改不影响t2,表明t1和t2指向不同地址
}
此时entities.ProBoduan.Local.Count为0。
3、
public void TestMethod10()
{
var entities = new SysProcessEntities();
var t2 = entities.ProBoduan.FirstOrDefault();
var t1 = entities.ProBoduan.ToList();
}
将第4行和第6行换下位置。
public void TestMethod10()
{
var entities = new SysProcessEntities();
var t1 = entities.ProBoduan.ToList();
var count1 = entities.ProBoduan.Local.Count;//3
var t2 = entities.ProBoduan.FirstOrDefault();
}
四、AutoDetectChangesEnabled & ValidateOnSaveEnabled
public void TestMethod9()
{
using (var entities = new SysProcessEntities())
{
entities.Configuration.AutoDetectChangesEnabled = false;
var ubs = entities.UserBrand;
);
var brands = from ub in ubs
from ob in obs
where ub.BrandID == ob.BrandID
select ub.BrandID;
var test = entities.ProBrand.Where(b => brands.Contains(b.ID)).ToList();
]).State;
test[].Description = "ggggg";
]).State;
entities.ProBrand.Remove(test[]);
}
}
t1、t2皆为EntityState.Unchanged,原因是entities.Configuration.AutoDetectChangesEnabled = false;若设为true,那么t2将为EntityState.Modified。注意此项设置对Added和Deleted没影响。当我们循环Add大批量数据到上下文中时,设为false将对性能有非常大的提升;该属性设置对循环修改已跟踪实体的属性(entity.Property = XXXX)关系不大,大批量修改已跟踪实体的属性的效率我测试过,非常快(不管是true还是false;当然设为false,然后修改实体属性,没什么意义)。
猜测:ValidateOnSaveEnabled表示在SaveChanges()时是否根据映射文件等判断实体是否符合规则(如Key是否被改变,默认已跟踪实体是不能手动改变Key值的等),以后测试!
转载请注明本文出处:http://www.cnblogs.com/newton/archive/2013/06/03/3115603.html
参考页面:.html
Entity Framework细节追踪的更多相关文章
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- 使用工具追踪Entity Framework生成的SQL
学习entity framework期间收集的文章,转自http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQuer ...
- 被Entity Framework Core的细节改进震撼了一下
今天用 SQL Server Profiler 查看 Entity Framework Core 生成的 SQL 语句时,突然发现一个细节改进,并且被它震撼了一下: exec sp_executesq ...
- "Entity Framework数据插入性能追踪"读后总结
园友莱布尼茨写了一篇<Entity Framework数据插入性能追踪>的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围.读完文章+评论,于是我自己也写了个 ...
- Entity Framework 6 Recipes 2nd Edition(13-5)译 -> 使POCO的修改追踪更高
问题 你正在使用POCO,你想提高修改跟踪的性能,同时使内存消耗更少.另外,你想通过EF的CodeFirst方式来实现. 解决方案 假设你有一个关于Account(帐户)和相关的Payments(支付 ...
- Programming Entity Framework 翻译(1)-目录
1. Introducing the ADO.NET Entity Framework ado.net entity framework 介绍 1 The Entity Relationship Mo ...
- Entity Framework Core 2.0 入门简介
不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Fu ...
- Entity Framework Core 2.0 入门
该文章比较基础, 不多说废话了, 直接切入正题. 该文分以下几点: 创建Model和数据库 使用Model与数据库交互 查询和保存关联数据 EF Core支持情况 EF Core的数据库Provide ...
随机推荐
- 【转】SQLState详解
根据 X/Open 和 SQL Access Group SQL CAE 规范 (1992) 所进行的定义,SQLERROR 返回 SQLSTATE 值.SQLSTATE 值是包含五个字符的字符串 . ...
- vsftp之虚拟用户
1.安装: yum install -y vsftpd yum install -y lftp2.创建用户useradd virftp -s /sbin/nologin3.创建虚拟用户及其存放路径vi ...
- MySQL调优三步曲(慢查询、explain profile)
在做性能测试中经常会遇到一些sql的问题,其实做性能测试这几年遇到问题最多还是数据库这块,要么就是IO高要么就是cpu高,所以对数据的优化在性能测试过程中占据着很重要的地方,下面我就介绍一些msyql ...
- 从USB驱动器运行Windows 10
我相信很多人和我一样.梦想着有个随身携带的U盘版操作系统.无论走到哪里,只要有电脑都可以随时运行自己配置好的操作系统.本篇博文就会一步步的教你如何从USB驱动器加载和运行Windows 10. 让我想 ...
- Asp.Net Core Authentication Middleware And Generate Token
.mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑 ...
- .Net程序员学用Oracle系列(21):分组查询(GROUP BY)
1.GROUP BY 标准分组 1.1.GROUP BY 概述 1.2.WHERE 和 HAVING 的区别? 2.GROUP BY 扩展分组 2.1.ROLLUP 分组 2.2.CUBE 分组 2. ...
- 3-15 JS基础知识02
一.For循环: For (var i = 0; i <= 10; i++){ 循环体: } 注意:For循环中的表达式是可以省略的,省略以后是个死循环. odd:奇数 even : 偶 ...
- 修改Delphi 10.1.2 edit控件在android的复制、剪切和粘贴样式
Delphi 10.1.2 edit控件在android默认的复制.剪切和粘贴样式太丑,经悟能-DelphiTeacher的提示,用最简单的代码修改后稍有改观. 默认的样式: 修改后的样式: 修改FM ...
- [Linux] PHP程序员玩转Linux系列-自动备份与SVN
我的代码经常在开发修改,为了代码的安全性,比如哪天误删了文件,或者哪天改错东西了,可以恢复回来,我要搞代码备份.备份代码,我先做最简单的,使用linux的定时机制加shell命令打包文件,每天按日期保 ...
- appledoc导出iOS代码文档的使用和问题详解(干货篇)
appledoc导出iOS代码文档的使用和问题详解(干货篇) 1. 简单说一下背景和自己感受 背景: 项目好像突然黄了,公司让详细写项目代码的注释并且导出文档,弄完之后就要封版. 说实话:听到这个消息 ...