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