国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET 的對象關系持久化機制(1)

2024-07-10 12:59:43
字體:
來源:轉載
供稿:網友
中國最大的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提取底層的本地客戶端庫使用類似的方法,而通過更高級的抽象,客戶端代碼變得更清晰,可讀。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沛县| 贡觉县| 明溪县| 泸溪县| 高平市| 姜堰市| 霍城县| 满城县| 庄浪县| 永新县| 昭觉县| 顺平县| 遂川县| 金乡县| 久治县| 乌拉特前旗| 泊头市| 固始县| 全州县| 南华县| 山丹县| 英山县| 措勤县| 中卫市| 吐鲁番市| 中超| 砀山县| 长垣县| 阿鲁科尔沁旗| 津南区| 澄迈县| 苏尼特右旗| 贵阳市| 吐鲁番市| 林口县| 建宁县| 桃园县| 普安县| 桐城市| 镶黄旗| 安塞县|