.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提取底層的本地客戶端庫使用類似的方法,而通過更高級的抽象,客戶端代碼變得更清晰,可讀。