Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Fram

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03



写在之前的话

在深入研究实体框架的细节之前,我们先讨论从传统的DataSet方法转换到基于对象的方法实现数据访问所带来的便利,以及这两种方法不同的工作方式是怎样导致采用像Entity Framework这样的O/RM工具。

使用Dataset和DataReader作为数据容器

我们先看一个例子。假设有一个数据库,有Order和OrderDetail两个表,表结构如下图:

我们要展示出所有的订单,只需创建一个简单的页面,用下面的代码即可完成。

using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlDataAdapter da = new SqlDataAdapter("Select * from order",
conn))
{
DataTable dt = new DataTable();
da.Fill(dt);
ListView1.DataSource = dt;
ListView1.DataBind();
}
}

完成了上面的需求,你的客户想看每个订单下面的详细信息,这时就变得有挑战性了,因为你可以选择有不同的方法实现:

1.先从Order表中查询出所有的订单,然后从OrderDetail表中为每一个订单查询详细信息。

2.对Order和OrderDetail两个表关连查询。

3.在两个不同的查询中检索出所有的订单和所有的详细信息。

不管选择哪一种方法,你的代码都由数据库的结构和检索数据的方式决定,每一次的改变都会很痛苦的。

下面的代码显示订单Id为1的详细信息。

using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cm = new SqlCommand("Select * from order
? where orderid = 1", conn))
{
conn.Open();
using (SqlDataReader rd = cm.ExecuteReader())
{
rd.Read();
date.Text = ((DateTime)rd["OrderDate"]).ToString();
shippingAddress.Text = rd["ShippingAddress"].ToString();
shippingCity.Text = rd["ShippingCity"].ToString();
}
using (SqlDataReader rd = cm.ExecuteReader())
{
details.DataSource = rd;
details.DataBind();
}
}
}

上面访问数据的方式完全没有安全性和通用性。

1.完全可以很容易的写出不用知道表中字段名称实现上面功能的通用代码。

2.用字符串指定一个表的字段名称丢失了类型安全性,如果名称不正确,只有在运行时才会抛出异常。

3.上面列的返回值是Object类型的,需要显示转换为合适的类型。

通用数据容器的缺陷

一、强耦合

DataReader和DataTable不允许你透明地检索数据,而不影响用户界面的代码。这意味这你的应用程序和数据库结构是强耦合的,对数据库结构的任何改变都需要对你的程序有所改动。这应该是在数据访问层解决的问题,而不是在用户界面层。

很多时候,数据库都是为一个应用程序提供服务,这样数据组织起来很容易被使用。但是,有些程序是建立在已有的数据库之上的,这时候就不能对数据库做任何改动,因为还有其他程序在使用这个数据库。这种情况下,你的代码可能跟数据库耦合性更强,甚至超出你的想象。例如,订单可能存储在一个表中,送货地址存储在另一个表中。数据访问层的代码可能减少这种影响,但是问题依然存在。

当列的名称发生改变又会发生什么呢,其实在开发的过程中这种事情经常发生。结果是,你必须改变用户界面层的代码来适应这一变化。

二、松散类型

取得存储在DataReader和DataTable中列的值,你通常要使用字符串指定列。下面的代码是取得DataTable中一列的值。

object shippingAddress = orders.Rows[0]["ShippingAddress"];

变量shippingAddress是Object类型的,它可以存储任何类型的数据,你可能知道它存储了一个字符型的数据,要像使用字符型一样使用它,必须显示的进行类型转换。

string shippingAddress = (string)orders.Rows[0]["ShippingAddress"];
string shippingAddress = orders.Rows[0]["ShippingAddress"].ToString();

进行类型转换在性能和内存使用上都有一定的损失,因为从值类型转换到引用类型要进行装箱操作,反之进行拆箱操作。

DataReader比DataTable有优势,它提供了不需要显式转换访问字段的类型方法,方法的参数接受列在一行中得索引值。它还提供了一个提供列的名称返回索引的方法。但是输入的字符串错误,也会抛出异常。

string address = rd.GetString(rd.GetOrdinal("ShippingAddress"));
string address = rd.GetString(rd.GetOrdinal("ShipingAdres")); //exception

三、性能问题

DataSet可能是.NET类库中最复杂的结构了。它包括一个或多个DataTable实例,每个DataTable实例又包括一系列DataRow对象,每个DataRow对象又由DataColumn对象构成的。DataTable可以由一个或多个列组成组成一个主键,还可以在某些列上声明外键,列还支持版本控制等等。尽管这些特性很多时候都是没用的,也常常被开发人员忽略,但是DataSet仍然在内部创建包含这些对象的空的集合。这对一个独立的应用程序可能是微不足道的性能损失,但是在一个多用户的环境中,有成千上万条请求,这将是不可接受的。

相比之下,DataReader可以适用在不同的场景中。DataTable从数据库中读出所有的数据放到内存中,但是很多时候你并不需要这么多的数据在内存中,你只需要一条条的从数据库中读出记录即可。另外一种情况,你经常查询数据而不用更新它,这种情况下,DataReader是最佳选择,因为它使用只读的方式检索数据。尽管DataReader提升了性能,但是它依然有类型转换带来的性能损失。

最后的话

下一篇,将讲解使用类来组织数据。

参考页面:http://qingqingquege.cnblogs.com/p/5933752.html

时间: 2024-08-08 13:56:55

Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Fram的相关文章

iOS 读书笔记 第一章

1.确定某个实例或类方法是否可用. 1)使用NSObject的类方法instancesRespondToSelector:来确定是否在该类的一个实例中存在一个特定的选择器. NSArray *array = @[@"1",@"2"]; if ([NSArray instancesRespondToSelector:@selector(sortUsingComparator:)]) { //do something use sortUsingComparator: }

Camel In Action 阅读笔记 第一章 认识Camel 1.1 Camel 介绍

1.1 Camel 介绍 Camel 是一个为了您的项目集成变得高效有趣的集成框架,Camel 项目在2007年初开始的,相对来说它还比较年轻,但它已然是一个非常成熟的开源项目,它所使用的是Apache 2开源License, 其背后的社区非常强大. Camel主要目的就是简化集成,当您用心读完本书以后,您会很感谢Camel并把它做为您的一个必需技能. Apache Camel这个项目之所以命名为Camel的主要原因是因为简单好记,有一个小道说法是项目创建者之一在吸了一个叫"骆驼"牌的

《Java并发变成实践》读书笔记---第一章 简介

<Java并发编程实战>深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册.书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险.构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容,最后介绍了一些高级主题,如显式锁.原子变量.非阻塞算法以及

《深入理解Java虚拟机》读书笔记---第一章 走进Java

一.为什么要读此书 <深入理解Java虚拟机>这本书读了很多次,每次读都会有不一样的感受.首先说一下为什么要读这本书,如果把Java比喻成乾坤大挪移,那了解虚拟机的工作原理就是练习九阳神功,java语言是招式,对虚拟机的认识是内功心法,只有内功心法强大,所使的招式才强大,这就是为什么阳顶天只能把乾坤大挪移练到第四层,而张无忌能练到第七层.由于java虚拟机的强大,把很多功能都隐藏了,例如内容管理,垃圾回收机制等,使得很多java程序猿对这一块的知识所有缺失,编码的时候也是似懂非懂的,以至于遇到

Apache Tomcat 7 读书笔记 - 第一章

Apache Tomcat 简介: 开源框架,下载地址:http://tomcat.apache.org/.可以嵌入独立的web应用,也可作为多个web应用的服务器. 基于Java的web应用服务器容器,能托管Servlet和Java Server Pages(JSP)的web应用.我们常用的J2EE框架,Spring MVC, Structs等,部署到Tomcat上去后,Tomcat会将其自动解析成Serlvet与JSP.在前后端开发完全分离的情况下(后台只提供接口,前端调用),不推荐使用原有

In-memory Computing with SAP HANA读书笔记 - 第一章:Basic concepts of in-memory

本文为In-memory Computing with SAP HANA on Lenovo X6 Systems第一章Basic concepts of in-memory computing的读书笔记. 作为基础概念,本章非常重要.此Redbook讲得浅显易懂,配图也容易理解.唯一需要深读是DL ACM的那篇论文,后续我会再补充. "卑之,毋甚高论,令今可行也", 本章正符合汉文帝对于张释之的要求. Basic concepts of in-memory computing In-

读书笔记 第一章

通过第一章的学习,我了解到了Android 是Google开发的基于Linux平台的开源手机操作系统.它包括操作系统.用户界面和应用程序以及移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍.Android采用WebKit浏览器引擎,具备触摸屏.高级图形显示和上网功能,用户能够在手机上查看电子邮件.搜索网址和观看视频节目等,比iPhone等其他手机更强调搜索功能,界面更强大,可以说是一种融入全部Web应用的单一平台. android的系统架构和其操作系统一样,采用了分层的

《算法导论》读书笔记--第一章

第一章 算法在计算中的作用 一.什么是算法?为什么算法值得研究?相对于计算机中使用的其他技术来说算法的作用是什么? 算法就是任何良定义的计算过程,该过程取某个值或者值的集合作为输入并产生某个值或者值的集合作为输出.这样算法就是把输入转换成输出的计算步骤的一个序列. 若对每个输入实例算法都以正确的输出停机,则称该算法是正确的,并称正确的算法解决了给定的计算问题.注意:不正确的算法只要其错误率可控时可能是有用的,但是我们通常只关心正确的算法. 数据结构是一种存储和组织数据的方式,旨在便于访问和修改.

《淘宝技术这十年》读书笔记——第一章 第二章

引言 ? ? 这本书的作者是子柳先生,子柳本名赵超,2004年加入淘宝网.历任开发工程师.项目经理.产品经理.测试经理,2009年随着淘宝系统的大规模重构和人才的迅速扩张,创办了"淘宝技术大学",因培养内外部工程师众多,人称"校长". ? ? 之所以读这本书,主要想了解淘宝的技术/业务发展过程中遇到过哪些问题,以及他们怎么解决的.在阅读的过程中有很多不懂的地方,主要是知识面确实涵盖的太广,就当拓展视野吧. ? ? 第一章 ? ? 淘宝架构初版 ? ? 淘宝的第一版源