知识大全 Entity Framework细节追踪
Posted 知
篇首语:大鹏一日同风起,扶摇直上九万里。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Entity Framework细节追踪相关的知识,希望对你有一定的参考价值。
Entity Framework细节追踪 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
为了加深对EF特性的了解 so 写了一些测试代码 测试结果也许对实际项目没什么用处 但是对理解EF的相关机制还是有一定帮助的 本文可能会不定期更新(加入新的测试用例= =)
一 事务
直接看代码
所有SaveChange包裹在一个TransactionScope里面
[TestMethod]
public void TestMethod ()
using (var entities = new SysProcessEntities())
using (TransactionScope scope = new TransactionScope())
try
var test = entities SysUser Where(o => o OrganizationID == ) ToList();
var test = entities SysRole ToList();
test[ ] Code = admin ;
test [ ] Name = dddd ;
entities SaveChanges();
test[ ] Code = admin ;
test [ ] Name = 全功能 ;
entities SaveChanges();
scope Complete();
catch (Exception e)
结果
>在 的基础上去掉TransactionScope
[TestMethod]
public void TestMethod ()
using (var entities = new SysProcessEntities())
var test = entities SysUser Where(o => o OrganizationID == ) ToList();
var test = entities SysRole ToList();
test[ ] Code = admin ;
test [ ] Name = dddd ;
entities SaveChanges();
test[ ] Code = admin ;
test [ ] Name = 全功能 ;
entities SaveChanges();
结果
>注释掉 的第 行和第 行 检查单独的一条语句是否自带事务
[TestMethod]
public void TestMethod ()
using (var entities = new SysProcessEntities())
var test = entities SysUser Where(o => o OrganizationID == ) ToList();
var test = entities SysRole ToList();
//test[ ] Code = admin ;
test [ ] Name = dddd ;
entities SaveChanges();
//test[ ] Code = admin ;
test [ ] Name = 全功能 ;
entities SaveChanges();
结果
>直接写Sql update [SysProcess] [dbo] [SysRole] set [name]= 全功能 where ID= 在查询分析器中执行 结果
>将 改为跨数据库
[TestMethod]
public void TestMethod ()
using (TransactionScope scope = new TransactionScope())
try
using (var entities = new SysProcessEntities())
var test = entities SysUser Where(o => o OrganizationID == ) ToList();
var test = entities SysRole ToList();
test[ ] Code = admin ;
test [ ] Name = dddd ;
entities SaveChanges();
test[ ] Code = admin ;
test [ ] Name = 全功能 ;
entities SaveChanges();
using (var entities = new DistributionEntities())
var test = entities VIPCard ToList();
test[ ] Sex = true;
entities SaveChanges();
scope Complete();
catch (Exception e)
string msg = e Message;
结果
>于是整个世界美好了……
二 AsNoTracking
注意AsNoTracking要写在最终返回数据的那行代码中才有用 看代码
[TestMethod]
public void TestMethod ()
using (var entities = new SysProcessEntities())
var ubs = entities UserBrand AsNoTracking();
var obs = entities OrganizationBrand Where(ob => ob OrganizationID == ) 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 obs = entities OrganizationBrand Where(ob => ob OrganizationID == );
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
继续看代码
public void TestMethod ()
var entities = new SysProcessEntities();
var t = entities ProBoduan ToList();
var t = entities ProBoduan ToList();
Assert AreEqual(t [ ] t [ ]);
大家以为t [ ]是否等于t [ ]?答案是true 可是作为引用类型 我并没有重载它的Equals方法 照理应该为false才对呀 修改下测试代码
public void TestMethod ()
var entities = new SysProcessEntities();
var t = entities ProBoduan ToList();
var t = entities ProBoduan ToList();
string name = t [ ] Name;
t [ ] Name = 随便取个名用来测试 ;
Assert AreEqual(name t [ ] Name);
结果
>可知 t [ ]和t [ ]指向的是同一个对象 即t 和t 指向同一个数组地址 也就是entities ProBoduan Local指向的地址 不过数据库中 仍执行了两次取数操作
then 加入AsNoTracking试试看
public void TestMethod () var entities = new SysProcessEntities();
var t = entities ProBoduan AsNoTracking() ToList();
var t = entities ProBoduan AsNoTracking() ToList();
string name = t [ ] Name; t [ ] Name = 随便取个名用来测试 ;
Assert AreEqual(name t [ ] Name); //true t 的更改不影响t 表明t 和t 指向不同地址
此时entities ProBoduan Local Count为
public void TestMethod ()
var entities = new SysProcessEntities();
var t = entities ProBoduan FirstOrDefault();
var count = entities ProBoduan Local Count;//
var t = entities ProBoduan ToList();
var count = entities ProBoduan Local Count;//
将第 行和第 行换下位置
public void TestMethod ()
var entities = new SysProcessEntities();
var t = entities ProBoduan ToList();
var count = entities ProBoduan Local Count;//
var t = entities ProBoduan FirstOrDefault();
var count = entities ProBoduan Local Count;//
public void TestMethod () var entities = new SysProcessEntities(); var t = entities ProBoduan FirstOrDefault(); var count = entities ProBoduan Local Count;// var t = entities ProBoduan ToList(); var count = entities ProBoduan Local Count;//
将第 行和第 行换下位置
cha138/Article/program/net/201311/13465相关参考
EntityFramework数据转换层通用类 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在
知识大全 ADO.NET Entity Framework 试水——并发
ADO.NETEntityFramework试水——并发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 ADO.NET Entity Framework 试水——并发[4]
ADO.NETEntityFramework试水——并发[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 ADO.NET Entity Framework 试水——并发[3]
ADO.NETEntityFramework试水——并发[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 ADO.NET Entity Framework 试水——并发[1]
ADO.NETEntityFramework试水——并发[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 ADO.NET Entity Framework 试水——并发[2]
ADO.NETEntityFramework试水——并发[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 ADO.NET Entity Framework 入门示例向导
ADO.NETEntityFramework入门示例向导 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
知识大全 ADO.NET Entity Framework存取数据库中图片
ADO.NETEntityFramework存取数据库中图片 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看
知识大全 详解ADO.NET Entity Framework 4中枚举的使用
详解ADO.NETEntityFramework4中枚举的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
知识大全 ADO.NET Entity Framework存取数据库中的图片
ADO.NETEntityFramework存取数据库中的图片 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来