微软的O/R映射技术--Visual Studio "Whidbey"的对象空间初识

** Visual Studio "Whidbey" ** ** 的对象空间初识 ** ** **

** 探索了 .Net ** ** 环境下的对象 / ** ** 关系映射框架 — ** ** 对象空间的特性 **

原作 :

Dino Esposito
Wintellect

February 2004

翻译 :

刘海东

2004-9-20

适用于 :

Microsoft® Visual Studio® code-named "Whidbey"
Microsoft® ADO.NET
Microsoft® SQL Server™ 2000
SQL Language

** 摘要 ** : **_ 对象空间 _ ** 是微软 VS 中最有趣的新特性 , 代号 Whidbey . 它是一个与微软 Ado.Net 和微软 .Net 技术完全集成的一个对象 / 关系映射工具 , 对象空间在你的商业层和物理库中原始数据之间增加了一个抽象层 . 你只管考虑设计程序要使用的对象 , 由对象空间负责通过使用 sql 语句从数据源中读写数据 .

** 提示 ** : Whidbey 在微软 2003.10 的开发大会上提供了预览代码 .

** 内容 ** ** : **

基本介绍

对象空间概述

从表映射到类

得到数据对象

持久层变动

与对象图合作

延迟加载

对象空间的好处

基本介绍

在设计 .Net 程序的数据访问层 (DAL) 时 , 通常由两种选择来建立商业表示层和 DAL 自己之间的双向交互 . 第一个选择是写一个类从 Ado.Net 对象中的读入和读出数据 . 第二个选择是用一个类来抽象底层的表 , 然后再根据需要添加逻辑和程序特性 . 这两种情况下 , 程序负责结构化数据在各层之间的传送 , 并使用 SQL 指令读写数据 .

在前一种情况下 , 主要的代码是要把表中的字段与用户界面的元素绑定 — 在写 .Net 程序时这一动作是非常方便的 . 这样做最大的缺点是需要写大量的 SQL 语句来处理数据 , 如果程序规模增加 , 会变得非常复杂和难以维护 , 这种程序的设计是以数据为中心 .

选择更加抽象和面向对象并不能完全摆脱这种情况 . 面向对象模型使你有了强壮的商业逻辑层 , 但还需要有一个层复杂把对象持久化到存储介质 . 而且这一附加层必须与存储介质的语法完全隔离开 .

面向对象的设计在纸上是幽雅而整洁的 , 但是实现起来却要花费大量的时间 . 尽管如此 , 当一个大型程序与管理紧密相关时 , 层次化的数据和对象化的术语是十分有帮助的 , 并且这也往往是你能顺利完成项目的唯一出路 . 正因为如此 , 对象关系映射 (O/RM) 工具已经出现了很久 , 并且已有多家供应商提供这一技术 .

一个 O/RM 系统使你能把一个存在的对象持久化到指定的存储介质 . 所以你需要一个 O/RM 系统来帮助你持久化对象 , 但你并不需要创建对象使用这一 O/RM 系统 . 你只要定义对象如何与物理的表和字段的映射关系 , 由 O/RM 来负责查询和更新表中的数据 .

对象空间 (ObjectSpaces)

对象空间是集成在 Whidbey 中的一个 O/RM 框架 , 它提供了一组类来处理 SQL Server 2000 和 SQL Server Yukon 数据的读写操作 . 对象空间引擎会把对象查询转换为对表的查询并把对象中属性的修改转换为对表的修改 . 返回调用所获取的数据都会先被转换成 .Net 的类 , 下面的图是对象空间的一个大概描述

图 1: 基于对象空间的程序整体架构

通过设计 , 商业规则描述了程序逻辑并控制问题域中各种实体间的相互作用 . 商业规则会形成一些与特定商业实体吻合的对象术语如 : 客户 , 订单 , 发票等等 , 而不仅仅是一些数据集和表 .

对象空间让开发者关注于商业实体 , 从而设计由合理对象组成的程序而不是一组数据流 . 对象空间只要求简单的映射类和数据表 . 之后由对象空间引擎处理数据源操作并把你从操作细节中解脱出来 . 因此 , 你只要用灵活的 , 可重用的和可扩充的对象来组成程序 , 在这同时 , 你就可以把数据存放在关系数据库中了 .

对象空间的架构位于程序逻辑和数据源之间 , 它使开发者能管理数据而不需要对数据的物理存储了解太多知识 . 通过使用对象空间 , 你持久化数据和读取数据都不需要写 SQL 代码 .

映射表到类

对象空间架构的根类是 ** ObjectSpace. ObjectSpace ** 类处理与数据源的信息交互并管理查询和获取数据源发生的动作 . 对象空间负责持久化对象到数据表并实例化查询的结果 . 为了使对象空间动作 , 需要映射结构到 ADO.Net 连接对象 . 映射模式可以是 XML 文件这样的静态资源 , 也可以通过 MappingSchema 对象的接口动态建立 .

MappingSchema 对象决定了哪些字段和表会被用于持久化对象数据 , 又应该从哪些字段和表中读取数据 . 下面的代码片断演示了如何实例化一个对象空间 :

Dim conn As SqlConnection = New SqlConnection(ConnString)

Dim os As ObjectSpace = New ObjectSpace("myMappings.xml", conn)

这里的连接对象只是一个普通的数据连接 , 其中包含了连接一个 SQL Server 实例的参数 .

映射模式分为 3 个部分 : 关系模式定义 (RSD), 对象模式定义 (OSD), 和映射模式 , 它负责连接前面两种模式 . 为了方便 , 你可以把每种模式放到独立的 XML 文件 . 在这种情况下 , 只有映射模式文件必须传递到对象空间的创建方法中 . 在映射模式中会引用关系模式和对象模式 .

下面的清单中显示的映射模式文件绑定了一个包含 Nothwind 数据库表的关系模式文件 (rsd.xml) 和一个对象模式文件 (osd.xml).

 1<m:mappingschema xmlns:m="http://schemas.microsoft.com/data/2002/09/28/mapping">
 2<m:datasources>
 3<m:datasource direction="Source" name="NorthwindRSD" type="SQL Server">
 4<m:schema location="RSD.XML"></m:schema>
 5<m:variable name="Customers" select="Customers"></m:variable>
 6</m:datasource>
 7<m:datasource direction="Target" name="DataTypesOSD" type="Object">
 8<m:schema location="OSD.XML"></m:schema>
 9</m:datasource>
10</m:datasources>
11<m:mappings>
12<m:map sourcevariable="Customers" targetselect="Samples.Customer">
13<m:fieldmap sourcefield="CustomerID" targetfield="Id"></m:fieldmap>
14<m:fieldmap sourcefield="CompanyName" targetfield="Company"></m:fieldmap>
15<m:fieldmap sourcefield="ContactName" targetfield="Name"></m:fieldmap>
16<m:fieldmap sourcefield="Phone" targetfield="Phone"></m:fieldmap>
17</m:map>
18</m:mappings>
19</m:mappingschema>

在上面 XML 文件的

 1<mappings> 内定义了数据表和一个  .Net  类的绑定关系  ,  其中详细设定了  Customer  表和  Customer  类的映射  .SourceField  属性是一个表的列  ,TargetField  是类的属性  .  例如  CustomerID  列绑定到  ID  属性  . 
 2
 3源数据的关系模式定义如下  : 
 4
 5<rsd:database name="Northwind" owner="sa" xmlns:rsd="http://schemas.microsoft.com/data/2002/09/28/rsd">
 6<r:schema name="dbo" xmlns:r="http://schemas.microsoft.com/data/2002/09/28/rsd">
 7<rsd:tables>
 8<rsd:table name="Customers">
 9<rsd:columns>
10<rsd:column name="CustomerID" precision="5" sqltype="nchar"></rsd:column>
11<rsd:column name="CompanyName" precision="40" sqltype="nvarchar"></rsd:column>
12<rsd:column allowdbnull="true" name="ContactName" precision="30" sqltype="nvarchar"></rsd:column>
13<rsd:column allowdbnull="true" name="Phone" precision="24" sqltype="nvarchar"></rsd:column>
14</rsd:columns>
15<rsd:constraints>
16
17&lt;P class=MsoNormal style="BACKGROUND: #eeeeee; MARGIN: 12pt 0cm; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt</rsd:constraints></rsd:table></rsd:tables></r:schema></rsd:database></mappings>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus