菜鸟对于ADO.NET访问技术说明详谈

开发 后端
我甚至不明白牺牲数据库访问次数相比一次ADO.NET访问多张表是不是代价更低?也许问题该这么问,相比而言数据库访问次数和一次取大数据量那个在应用时更容易成为性能的瓶颈?

 在上一文末写了几个关于用Include加载多级实体的查询,不过前天在ADO.NET访问看到一个关于Include加载多级实体的问题,经过一番交流和测试,算是明白了所以然.虽然自己常常在那样写ADO.NET访问查询,也许是因为在使用的过程中没有遇到棘手的问题,所以也没去多想.
  
   在本文之前,还是先说说那个问题.在edm中这样的一个关系:Customers 1 --- * Orders * --- 1 Status,在这个关系下面做这样一个查询 var = query from customer in Customers.Include("Orders.Status") ADO.NET访问在调试的时候他发现Customer的Order被及时加载(PreLoad),Status却没有.所以问题人觉得这是不是EF在设计上的缘故,还是其他什么原因.我告诉他不是设计上的原因,因为我就常那么写,当然标准的写法是Inclue("Orders").Include("Orders.Status").

之前我在adonot blog上看到关于Linq to Sql与 Linq to Entity 在Eager Loading方式上的区别,也见过那样写,ADO.NET访问当然最关键的,我那样做查询没有出先上述的问题.不过我还是在想,难道这个查询出现问题是和模型的1:n:1关系有关吗?

以前都没在意这些,我在使用过类似这种查询的地方,的确没有符合这种关系.于是我昨天做了一个测试在ADO.NET访问里面恰好有Products 1--* OrderDetails *--1 Orders 符合条件的一组关系,并做了写了如下的代码,ADO.NET访问一边debug,一边跟踪数据库,的确只生成一条sql.后来我又选了1:n:n以及Customer 1:n Order 1:nOrderDetails的关系组也均都只生成一条sql.

在上面这段代码中,通过getOrderListByCity方法London城市的Orders,并由每一个Order查找相应Customer的CustomerID.由于存在一个循环,故总共访问数据33次.但是真的是由于Orders.CustomerID有33个吗?显然不是,ADO.NET访问从上图运行结果来看就知道,其中有很多CustomerID是重复的.那有什么方法阻止数据库重复查询呢?.在EF内对于关连实体(导航属性)除了关联实体外还有一个属性**Reference属性

该属性暴露了一个属性IsLoad,判断关联实体是否已经加载.在EF中实体是依靠entityKey(数据库表主键)来识别的,一旦该entity Key对应的实体已被加载,context就不会重复去数据库去取了,如果该entity key对应实体没有被加载,就会去数据库去取.所以增加这样一个判断

 

责任编辑:chenqingxiang 来源: CSDN
相关推荐

2009-12-21 16:53:06

ADO.NET使用说明

2009-12-24 13:38:07

ADO.NET技术

2009-12-30 15:21:55

ADO.NET访问

2009-12-23 17:54:01

ADO.NET 2.0

2009-12-21 14:39:09

ADO.NET技巧

2009-12-23 14:07:09

ADO.NET实例对象

2009-12-18 13:52:39

ADO.NET设计器

2009-12-22 17:43:26

ADO.Net技术

2009-12-18 17:06:37

ADO.NET 数据库

2009-12-23 09:32:26

ADO.NET数据对象

2010-01-04 10:39:33

ADO.NET描述

2009-11-04 17:22:30

ADO.NET数据访问

2009-12-24 10:37:03

ADO.NET访问数据

2009-12-31 15:39:46

ADO.NET访问数据

2009-12-24 11:04:21

ADO.Net技术

2009-12-31 09:54:04

ADO.NET数据访问

2009-12-23 16:43:34

ADO.NET模型

2009-12-29 13:57:30

访问ADO.NET

2009-12-23 09:26:56

ADO.NET属性

2009-12-30 16:05:20

ADO.NET实例
点赞
收藏

51CTO技术栈公众号