知识大全 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

相关参考

知识大全 Entity Framework数据转换层通用类

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)小编为大家搜集整理后发布的内容,让我们赶快一起来