【摘 要】Entity Framework隨Visual Studio 2010 正式發(fā)布以來(lái)應(yīng)用日益得到推廣。Entity Framework技術(shù)基于傳統(tǒng)的實(shí)體聯(lián)系模型建立,概念清晰,明顯提高開發(fā)效率,這一技術(shù)必將成為基于Asp.NET 網(wǎng)頁(yè)開發(fā)平臺(tái)開發(fā)的主流數(shù)據(jù)持久化技術(shù)。
【關(guān)鍵詞】Entity Framework;Asp.net網(wǎng)站;綁定
一、引言
在傳統(tǒng)的.net網(wǎng)站編寫時(shí)需要查詢數(shù)據(jù)源,就必須使用傳統(tǒng)ado.net 技術(shù),雖然傳統(tǒng)ado.net 把數(shù)據(jù)庫(kù)轉(zhuǎn)換成DataSet技術(shù)執(zhí)行效率較高,但編寫復(fù)雜,必須拼寫出一長(zhǎng)串的SQL語(yǔ)句才能得出數(shù)據(jù),這樣在程序編寫過(guò)程中無(wú)法判斷SQL語(yǔ)句是否正確,很容易出現(xiàn)SQL注入風(fēng)險(xiǎn),對(duì)于不同的數(shù)據(jù)庫(kù)編寫的SQL語(yǔ)句也必然有微小的區(qū)別,導(dǎo)致開發(fā)人員必須要掌握多種數(shù)據(jù)源的操作方法,才能夠熟練地進(jìn)行網(wǎng)站開發(fā)。
為了解決這些問(wèn)題,提高開發(fā)效率,對(duì)象/ 關(guān)系映射(Object/Relational Map- ping,ORM)技術(shù)應(yīng)運(yùn)而生。ADO.NET Entity Framework 是微軟以ADO.NET為基礎(chǔ)發(fā)展出來(lái)的ORM解決方案。在Entity Framework中的實(shí)體數(shù)據(jù)模型(EDM)由以下三種模型和具有相應(yīng)文件擴(kuò)展名的映射文件進(jìn)行定義。
概念架構(gòu)定義語(yǔ)言文件 (.csdl) ——概念模型定義。
存儲(chǔ)架構(gòu)定義語(yǔ)言文件(.ssdl) ——存儲(chǔ)模型定義(又稱邏輯模型)。
映射規(guī)范語(yǔ)言文件(.msl) ——存儲(chǔ)模型與概念模型之間的映射定義。
概念模型(.csdl)對(duì)應(yīng)了程序中需要使用的類,存儲(chǔ)模型(.ssdl)對(duì)應(yīng)了程序中需要使用數(shù)據(jù)表,二者通過(guò)映射規(guī)范語(yǔ)言(.msl)文件進(jìn)行了對(duì)應(yīng),這樣數(shù)據(jù)表成功的映射成為實(shí)體對(duì)象,實(shí)體框架使用這些基于XML 的模型和映射文件將對(duì)概念模型中的實(shí)體和關(guān)系的創(chuàng)建、讀取、更新和刪除操作轉(zhuǎn)換為數(shù)據(jù)源中的等效操作。EDM 甚至支持將概念模型中的實(shí)體映射到數(shù)據(jù)源中的存儲(chǔ)過(guò)程。它提供以下方式用于查詢EDM 并返回對(duì)象:
LINQ to Entity ——提供語(yǔ)言集成查詢(LINQ) 支持用于查詢?cè)诟拍钅P椭卸x的實(shí)體類型。
Entity SQL ——與存儲(chǔ)無(wú)關(guān)的SQL 方言,直接使用概念模型中的實(shí)體并支持諸如繼承和關(guān)系等EDM 功能。
查詢生成器方法——可以使用LINQ 風(fēng)格的查詢方法構(gòu)造 Entity SQL 查詢。
2007年,微軟將LINQ作為.NET Framework 3.5中的一部分正式開始推出,它首次使用了一種類似于SQL語(yǔ)句的語(yǔ)法形式統(tǒng)一了對(duì)整個(gè).Net Framework框架下的數(shù)據(jù)源的操作,從而使開發(fā)人員只需要使用簡(jiǎn)單的LINQ語(yǔ)句就可以查詢出不同數(shù)據(jù)源的數(shù)據(jù)。LINQ的語(yǔ)法很像SQL語(yǔ)句但又有所不同,它的關(guān)鍵詞包括:from、in、where、order by 、select、group by,此外必須要以select或者group by結(jié)尾。
它的語(yǔ)法格式為:var臨時(shí)變量=from臨時(shí)變量in集合對(duì)象或數(shù)據(jù)庫(kù)對(duì)象
where 條件表達(dá)式
[order by條件]
select 臨時(shí)變量中被查詢的值
[group by 條件]
此外,LINQ還支持大量的SQL語(yǔ)法,例如Avg,Sum,Count等等。
由于引入了LINQ to Entities作為中間層查詢、插入、更新和刪除操作全部使用LINQ語(yǔ)句實(shí)現(xiàn),再通過(guò)Entity SQL轉(zhuǎn)換LINQ語(yǔ)句為具體數(shù)據(jù)庫(kù)的SQL語(yǔ)句,實(shí)現(xiàn)了與數(shù)據(jù)庫(kù)無(wú)關(guān)性,降低了開發(fā)人員學(xué)習(xí)復(fù)雜度,提高了效率。
二、LINQ to Entity 訪問(wèn)數(shù)據(jù)庫(kù)
LINQ to Entity 創(chuàng)建ObjectContext封裝實(shí)體類,此類作用是“創(chuàng)建”、“讀取”、“更新”和“刪除”操作,并提供查詢所需要的linq語(yǔ)句。類名為:XJZXEntities派生自O(shè)bjectContext類,所使用的是華夏學(xué)院現(xiàn)代教育技術(shù)中心網(wǎng)站的數(shù)據(jù)庫(kù)。XJZXEntities xjzx = new XJZXEntities();通過(guò)這個(gè)類的實(shí)例可輕松實(shí)現(xiàn)各類數(shù)據(jù)庫(kù)操作,以下代碼使用LINQ to Entity 實(shí)現(xiàn)數(shù)據(jù)表Tb_Common_Role(權(quán)限)插入查詢操作:
實(shí)現(xiàn)數(shù)據(jù)表Tb_Common_Role(權(quán)限)插入操作:
實(shí)現(xiàn)數(shù)據(jù)表Tb_Common_Role(權(quán)限)插入操作:
實(shí)現(xiàn)數(shù)據(jù)表Tb_Common_Role(權(quán)限)刪除操作
實(shí)現(xiàn)數(shù)據(jù)表Tb_Common_Role(權(quán)限)更新操作
Entity Framework可以非常方便的實(shí)現(xiàn)各種數(shù)據(jù)表的插入、刪除、更新、查詢操作,注意每張數(shù)據(jù)表必須要有對(duì)應(yīng)的主鍵,如無(wú)主鍵執(zhí)行過(guò)程中會(huì)出現(xiàn)錯(cuò)誤。
三、Entity Framework與Asp.net Web控件的綁定
Asp.net提供了許多xxxDataSource控件,如SqlDataSource,ObjectDataSource等,這些數(shù)據(jù)源控件大大方便了我們的數(shù)據(jù)綁定操作。不幸的是目前還沒有針對(duì)Entity Framework的數(shù)據(jù)源控件發(fā)布,但是將數(shù)據(jù)綁定到諸如ListBox,Gridview或DetailsView控件也是很簡(jiǎn)單的。這源于使用ObjectContext操作返回的IQueryable
這樣很容易將這些數(shù)據(jù)綁定到數(shù)據(jù)控件并在網(wǎng)頁(yè)上顯示結(jié)果。
四、Entity Framework分頁(yè)語(yǔ)句研究
在linq中提供了take和skip實(shí)現(xiàn)分頁(yè)操作,Take: 返回前N條記錄,丟棄剩余部分,SQL對(duì)應(yīng)語(yǔ)法為TOP n子查詢;Skip:跳過(guò)前N條記錄,返回剩余部分,SQL對(duì)應(yīng)語(yǔ)法為Where ROW_NUMBER()或者NOT IN(Select Top N…)其代碼如下:
Skip語(yǔ)句使用的是Sql2005 版本才出現(xiàn)的ROW_NUMBER方法進(jìn)行分頁(yè),其代碼在Sql2005 和Sql2008上執(zhí)行效率高的驚人,Entity Framework內(nèi)建的skip limit分頁(yè)生成的分頁(yè)語(yǔ)句對(duì)oracle 和sql2005以下的版本無(wú)效,根本原因是其使用的ROW_NUMBER方法在oracle 中與 mssql中的函數(shù)意義不一樣,而sql2005以下版本根本沒有ROW_NUMBER,造成其在oracle和sql2000中分頁(yè)失效。經(jīng)過(guò)研究對(duì)比生成的Sql語(yǔ)句發(fā)現(xiàn),只要替換掉Skip就可以修正這個(gè)問(wèn)題具體代碼如下:
這樣做雖然降低了一點(diǎn)執(zhí)行效率,但代碼通用性得到了加強(qiáng),在oracle和sql2000中不用修改代碼即可使用。
五、Entity Framework更改數(shù)據(jù)庫(kù)的連接字符串
默認(rèn)情況下(Visual Studio對(duì)Entity Framework數(shù)據(jù)項(xiàng)目的默認(rèn)設(shè)置),EDM這個(gè)XML文件被作為資源在編譯時(shí)嵌入到程序集中。這種情況下當(dāng)更改EDM后需要重新編譯這個(gè)程序集才能 使更改生效。通過(guò)更改項(xiàng)目屬性也可以讓EDM作為三個(gè)獨(dú)立的XML文件存在于項(xiàng)目中。為了讓應(yīng)用程序可以找到EDM(無(wú)論其以什么方式存儲(chǔ))需要一個(gè)鏈接 字符串來(lái)指示EDM所在的位置。實(shí)體模型設(shè)計(jì)器生成的鏈接字符串如下所示:
關(guān)鍵的一點(diǎn)應(yīng)用程序是怎樣找到這個(gè)字符串的,對(duì)于使用EntityClient的情況,可以直接將連接字符串賦給EntityConnection的ConnectionString屬性,另外對(duì)于使用ObjectContext,其可以自動(dòng)由配置文件檢索這個(gè)連接字符串。
六、結(jié)語(yǔ)
使用Entity Framework 可以非常簡(jiǎn)單的把關(guān)系型數(shù)據(jù)源通過(guò)XML 文件定義為對(duì)象類,并用這些類完成數(shù)據(jù)訪問(wèn),大大提高了數(shù)據(jù)訪問(wèn)層編程效率。雖然EDM在數(shù)據(jù)訪問(wèn)時(shí)跟SQL 語(yǔ)句比效率有待提高,但是其靈活方便的使用必將替代ADO.NET SQL語(yǔ)句拼接方式,成為Asp.NET 平臺(tái)主要數(shù)據(jù)訪問(wèn)方式。
參 考 文 獻(xiàn)
[1]Roger著,孟兆煒譯.ADO.NET 3.5高級(jí)編程——應(yīng)用LINQ Entity Framework[M].北京:清華大學(xué)出版社,2010(4)
[2]微軟MSDN