首页 > 开发 > .Net > 正文

.NET 的对象关系持久化机制(1)

2020-02-03 15:56:01
字体:
来源:转载
供稿:网友
中国最大的web开发资源网站及技术社区,
翻译的目的一是锻炼e文,二是为学些东西,如果这是有任何翻译问题,请通知我一声(mailto:[email protected] 或者 http://wonderf.blogone.net/)

由于本人e文有限,错误还请包涵。

原文:http://www.15seconds.com/issue/040112.htm

关键字:orp objectspaces 对象 关系 持久




.net 的对象关系持久化机制

第一章 关于一种新的数据访问方式

介绍
在几个星期前,.net对象关系持久化(object-relational persistence for .net)的爱好者还是屈指可数。他们认为,可以用一种专门的数据提供方式从应用程序中消除那些冗长的ado.net代码和减少商业逻辑代码。事实上大多数的.net开发者,希望可以少写些数据访问层(ado.net)的代码

如果你参加了pdc会议,你可以从许多线索中了解到microsoft的一个新的数据访问策略。在whidbey和之后的visual studio 版本,将会大量增加orp(对象关系持久化)功能。

令我惊喜的是有许多人参加了我和dave foderick主持的object-relational birds of a feather (bof)会议。我原先期望会议 大约有10几位关注orp的专业人士参与,讨论关于orp,以及目前.net or 工具,聊聊各自的经验。出乎意料的是,有超过100位的人士参与了这次讨论。有支持者,反对者,一些感兴趣的人,甚至一些or的工具厂商,气氛很热烈。整个下午,microsoft的 objectspaces team 在一个挤满人的房间里演示了orp framework。

对象关系这种能力并不是只用于objectspaces.你可以在微软的下个sql server 版本yukon中找到很多or(object-relational)痕迹。yukon 可以运行基于clr的代码,使用.net语言编写的存储过程和clr类型。业务对象可以通过ado.net的参数传递到存储过程,然后被.net存储过程代码分解成关系结构,除此之外,yukon 表的 数据列可以是包含基于clr的复杂类型。假设这样的一种情况,一个业务对象作为参数被传递到yukon,这个对象可以持久的作为一个列值被保存到数据库,要比分解成关系结构再存入数据库好的多。

假设在一个应用中,有一个person类用来保存个人的简单信息,包括id,name,birthday

以下是这个person表 在sql server 2000 中的ddl定义

create table [dbo].[person] (

[id] [int] identity (1, 1) not null ,

[name] [varchar] (50) collate sql_latin1_general_cp1_ci_as not null ,

[birthday] [datetime] null

) on [primary]


而在yukon中你可以这样写:

create table [dbo].[person] (

[id] [int] identity (1, 1) not null ,

[person] [person] not null

) on [primary]




两者主要的不同之处是:yukon ddl中含有一个person类型的列,而person是.net对象,显而易见,在yukon中你可以直接定制一个.net对象类型的列。



为了使这个column能容纳clr类型,首先这个类型将被编译,然后安装到sql server。

看一个person类的例子:

using system;

using system.data.sql;

using system.data.sqltypes;

using system.runtime.serialization;

namespace scottbellware.personexample

{

/// <summary>

/// represents a person.

/// </summary>

[serializable]

[sqluserdefinedtypeattribute(format.userdefined)]

public class person

{

private int id;

private string name;

private datetime birthday;

public int id

{

get{return this.id;}

set{this.id = value;}

}



public string name

{

get{return this.name;}

set{this.name = value;}

}



public datetime birthday

{

get{return this.birthday;}

set{this.birthday = value;}

}

}

}


当这个类编译成dll文件后,你可以在sql server yukon 中注册它,这是注册dll的t-sql语句:

create assembly personexample from 'c:/assemblies/scottbellware.personexample.dll'


这样就在yukon里创建了这个类,本质上是在yukon里为这个类注册了个别名,yukon会引用这个包含在dll里的clr类型。在上面的ddl 表里定义了一个person类型的列,所以需要在yukon中创建这个类型

创建的代码如下:

create type person

external name [personexample]:person


你可以使用带参数的dml语句向person表里插入一个person实例

insert into person (person) values (@person)


如果你有使用ado.net 1.x dataparameter 对象的经验,上面的dml语句可能会引起你的好奇。在ado .net 1.0版本中,dataparameter 对象只可以包装标量值。上面的命令语句显示了在ado .net 2.0中sqlparameter class的改变。你可以通过代码中往数据库传入复杂类型。

往数据库里传入一个定制的类型的所写代码式样类似于通过ado .net 1.x dataparameter objects.往数据库传入标量值。

在ado .net 2.0中,sqlparameter 对象实例被通过引用传递,sqlparameter类新增了一个udttypename属性。使用这个属性,来指定sqlparameter实例,用来传递复杂类型的 包装参数名字。同样,在sqldbtype 枚举类型里也增加了sqldbtype.udt类型,来指定复杂类型或用户定义类型的值。

以下的例子示范了ado.net2.0客户端代码执行一个带有复杂参数的查询。假设已经存在一个名为connection的sqlconnection 对象实例和一个名为person的person对象实例,同时数据库连接已经被打开。

// create a command from the connection object.

sqlcommand insertcommand = conection.createcommand();



// assign the dml to the command command text.

insertcommand.commandtext = nsert into person (person) values (@person)?



// parameter object to encapsulate the person instance.

sqlparameter parameter = insertcommand.parameters.add( person? sqldbtypes.udt);



// set the type name of the parameter抯 encapsulated complex type.

parameter.udttypename = cottbellware.personexample.person?



// assign the person instance to the parameter抯 value.

parameter.value = person;



// execute the command.

command.executenonquery();


从长远看,longhorn 将在平台级别带给我们or。longhorn的文件系统基于下一代的sql server技术,而objectspaces将在其中扮演关键的角色,已经成为 longhorn api 中的基本对象。


你会在微软将要发布mbf中看到对象关系持久化机制。mbf提供抽象机制来描述业务对象和创建商业应用的业务过程,同时它也可以被objectspaces保持持久化。

对象关系持久化在传统的数据访问中使用很少,而在.net的数据访问模式和机制中得到应用。.net的数据访问命令和结果通过数据访问层的api传递,即使这些是在对象关系持久的架构内。对象关系持久架构提取底层api 与ado.net提取底层的本地客户端库使用类似的方法,而通过更高级的抽象,客户端代码变得更清晰,可读。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表