所屬欄目:電子技術論文 發布日期:2014-12-22 14:33 熱度:
企業在開發軟件的過程中,為提升開發效率和增加技術積累,對不同的項目需求提取出一些共同的框架,數據庫訪問層便是其中之一。目前有很多好地 ORM[1?2](對象關系映射機制)框架已經很好地實現了數據訪問層,而且得到了很廣泛的應用,但由于許多公司技術人員水平有限,提取的數據庫訪問層和業務邏輯層的耦合程度不高,對開發效率上的提升不夠明顯[3]。
摘 要: Entity Framework技術因其靈活、開發周期短等優點,被廣泛運用到.NET平臺開發中。基于Entity Framework框架設計一個典型MVC架構中的數據庫訪問層,運用Entity Framework框架中的Code First方式結合泛型、封裝、單例模式等技術,實現實體類映射到數據庫表并自動往數據庫建表的功能,并對每個實體類自動向外發布了增、刪、改、查4種操作方法,編譯成DLL庫文件以插件的形式供業務邏輯層調用,達到與業務邏輯和數據庫完全解耦。
關鍵詞:電子技術論文, 實體框架,泛型類型,接口,數據庫
Research and application of database access mechanism based on .Net Entity Framework
SHEN Xia?fei, WANG Jian?zhong
(Institute of Information and Control, Hangzhou Dianzi University, Hangzhou 310018, China)
Abstract: Entity Framework technology is widely used in .NET platform development due to its flexibility, short development cycle and other advantages. A database access layer in typical MVC architecture was designed based on Entity Framework. The Code First mode in Entity Framework combined with a generic framework, packaging, single?case model and other technologies is used to realize the entity classes mapping to database tables and generate the database tables automatically. The operations of addition, deletion, update and selection are released to each entity class automatically. The DLL library files are compiled for the business logic layer call in the form of plug?in to achieve the complete decoupling of business logic and database.
Keywords: Entity Framework; generic type; interface; database
0 引 言
本文設計的數據庫訪問層解決了以上問題,它與業務邏輯低耦合,使用簡單,以高度封裝的DLL形式調用,可以節省大量的對數據庫存取的繁瑣操作,程序員能從數據庫存取中解脫出來專注于業務邏輯的設計。
1 相關技術
1.1 Entity Framework
實體框架,是一種對象關系映射機制(ORM),能夠減少.NET Framework開發人員面向對象編程環境與關系數據庫環境之間的不匹配情形[4],使開發人員基本上可以通過熟悉的面向對象的技術來與應用程序的概念模型進行交互[5]。在實體框架中,開發人員能夠以特定于域的對象和屬性(如客戶和客戶地址)形式使用數據,而不必考慮存儲此數據的基礎數據庫表和列。開發人員可以對概念模型發出數據訪問操作,然后實體框架會將該操作轉換為關系數據庫操作。
1.2 Code First
Code First是基于Entity Framework的新的開發模式,原來只有Database First和Model First兩種[6]。Code First顧名思義,就是先用C#/VB.NET的類定義好領域模型(實體類),然后用這些類映射到現有的數據庫表或者自動產生新的數據庫表。Code First同樣支持通過Data Annotations或fluent API進行定制化配置[7]。其中Entity Framework庫里面的DbContext基類為操控實體對象執行上下文環境,提供所需的架構和映射元數據(Meatadata)、數據庫鏈接,同時還包括對象緩存、跟蹤狀態和關聯管理等功能[8]。使用時,定義一個繼承于DbContext的類,在該類里面配置好需要映射到數據庫表的各實體類。配置好后,這個類就成為了業務邏輯層里實體類和數據庫表交互的中間模型。 2 數據庫訪問機制設計
2.1 總體設計框架
數據庫訪問層是搭建在.NET Entity Framework框架的Code First方式之上的,將映射到數據庫表的各實體類通過DbContext類的擴展類配置好后,這個擴展類負責這些實體類與數據庫表的交互,這些實體類便共用了這個執行上下文環境。當不需要定制復雜的映射關系(大部分情況下)時,可以直接以dll的形式使用本模塊,這么做實際上是每個實體類通過一個 DbContext類的擴展類映射到數據庫,即每個實體類獨立一個執行上下文環境,將實體類泛型化,每個實體類通過泛型類型傳入數據訪問層,該層會通過層層調用自動生成對應的DbContext類的擴展類(執行上下文)。當需要進行定制化配置時,可以重寫 DataContextService,DataContextProvider,DataContext三個抽象類,手動進行實體類的配置,并在配置文件里配置好關系。可見本模塊的可擴展性比較好。
如圖1所示,該數據庫訪問模塊邏輯上又分三層:基礎服務層、倉儲層、數據訪問層。基礎服務層,該層通過讀取配置文件信息獲得對應倉儲的程序集名和類型名,然后通過“反射”獲取該倉儲類型的對象。倉儲層,提供對應不同數據庫(SQL Server、Oracle等)的數據庫訪問層。數據庫訪問層,直接與數據庫相連并對外提供增、刪、改、查等底層方法以供頂層調用,這里采用了微軟的 Code First框架來實現對數據庫的直接訪問,也就是數據訪問層。其中,基礎服務層和倉儲層都繼承了同一個接口IDataContextProvider,該接口在倉儲層得以實現,從而實現了業務邏輯層、數據庫訪問層、數據庫三者之間的解耦。
2.2 基礎服務層
基礎服務層提供數據庫訪問層對外接口的定義和對內數據訪問的管理,是業務邏輯層和數據庫訪問在邏輯上的中間連接層。
如圖2所示,DataContextService為基礎服務層的核心抽象類,業務邏輯層(如:DomainObjectContext Service類)實現該類型,以訪問該業務邏輯模塊所提供的數據相關的操作。各個業務層模塊針對自身模塊的數據訪問服務,必須繼承于該類。并重寫配置文件ConfigurationGuid,就可以實現通過配置文件探查到數據訪問層。本類為業務層和數據訪問層解耦提供基礎服務。該類實現了 IDataContextService接口,IDataContextService接口中定義了一個GetRepository()方法返回了一個 Repository泛型對象,該對象封裝了對數據庫的增、刪、改、查方法,并繼承了IQueryable即支持linq查詢。
DataContextService里面ConfigureSectionName是配置文件配置節的名稱。當實現 DataContextService的擴展類探查到數據庫訪問層后,將返回的倉儲對象與自己索引起來存入Dictionary(索引容器)里面,下次探查對應倉儲對象時就不需要再通過反射獲取對象,這樣可以提高代碼運行效率,本文的設計中多次用到這種方式來提升模塊性能。返回的倉儲對象才真正實現GetRepository()方法。
2.3 倉儲層
倉儲層為基礎服務層提供對應服務,Code first是以Dbcontext模型為容器把實體對象和數據庫建立起鏈接的,不同的實體對象可能屬于不同的容器,倉儲層就實現了具體的實體對象和對應的Dbcontext模型索引。
如圖3所示,DataContextProvider為倉儲層的核心抽象類,實際的倉儲類(如DomainObjectContext Provider類)繼承該類型并實現CreateDbContextCore()虛方法,以提供該倉儲類對應數據庫訪問層即對應的DbContext的擴展類。DbContext的擴展類是讀數據庫訪問方法的最終提供者,EFRepository 類通過傳入不同的DbContext擴展類實現了IRepository接口。
圖3 倉儲層結構
2.4 數據訪問層
數據訪問層實現了一套對不同的實體對象自動生成對應Dbcontext模型的機制,這樣外部業務邏輯層使用本模塊,通過泛型參數傳入實體類型,該機制就會對其自動生成屬于這個實體的Dbcontext模型。
如圖4所示,該層基于EF的Code first方式配置模型實現對數據庫的訪問,DbContext繼承DbContext,重寫了數據庫鏈接字符串,并修改了EF庫對多個DbContext擴展類訪問同一數據庫沖突的漏洞,且實現了數據遷移特性即當實體類里有字段變化時,這種變化能自動移植到對應的數據表列。然后用戶可以繼承DbContext類根據自身的需求配置不同的實體對象執行上下文環境,并向上提供給對應倉儲類。目前DbContext已支持Sqlserver之外的數據庫如Oracle,所以通過配置甚至可以實現對Oracle數據庫的訪問支持。
3 應用研究
本文實現的數據庫訪問模塊主要目的在于實際應用,為了更直接地展示其使用的快捷、簡單,下面通過實際例子加以說明。
圖4 數據訪問層
先定義一個實體類Person,繼承于DomainObject。這里DomainObject類只有一個Guid類型的字段。本模塊設計時對實體類做出了限制:任何實體類只有繼承于DomainObject類才能被映射到數據庫。
public class Person:DomainObject {
public string Name { get; set; }
public int Age { get; set; } }
打開VS開發環境,建立一個控制臺應用,添加以下代碼:
DomainObjectDataContextService.UsingDataContext( );
Person me = new Person( ) { Name="張三",Age=24};
using (var persons = DomainObjectDataContextService.Instance.GetRepository( )){
persons.Add(me);
persons.Save( );
}
如圖5所示,在這段代碼執行之前在數據庫里沒有任何數據庫以及表。運行之后,在數據庫里可以看到如圖6結果,增加了YUNGO_SYS_DB2數據庫和People數據表以及一條新的記錄。
<\192.168.6.11現代電子技術14年37卷第24期Image17T5.tif>
圖5 執行前數據庫
刪除記錄操作代碼示例:
using (var persons = DomainObjectDataContextService.Instance.GetRepository()){
var p = from person in persons
where person.Name == "張三"
select person;
persons.Remove(p.First());
persons.Save();
}
查詢數據庫操作代碼示例
using (var persons = DomainObjectDataContextService.Instance.GetRepository()){
var p = from person in persons
where person.Name == "張三"
select person;
string name = p.First().Name;
int age = p.First().Age;
}
改記錄操作代碼示例
using (var persons = DomainObjectDataContextService.Instance.GetRepository()){
var p = from person in persons
where person.Name == "張三"
select person;
p.First().Age=20;
persons.Save(); }
總的來說,通過實體框架的對象層,可以執行以下任務:針對概念模型運行查詢;跟蹤針對對象做所需的更改;將對象更改傳播回數據源;將對象綁定到控件。
圖6 執行后數據庫
4 結 語
本文詳細分析了數據庫訪問機制的各部分結構,并介紹了應用方法。該機制缺點是不支持存儲過程,優點是在進行數據庫操作時不需要建表,大量需要手動書寫代碼配置的映射關系通過泛型可以自動生成;高度封裝對外公開有限接口,所以使用時操作簡單;代碼結構清晰,各部分模塊化程度高,繼承體系完美,所以擴展性強,對于需定制的映射關系,修改方便。
參考文獻
[1] 袁立國,陳中育,李方鵬,等.一種軟件開發框架的設計優化[J].計算機系統應用,2013,22(5):70?74.
[2] 盧小垂.基于.NET平臺的ORM輕量級開發框架的設計與實現[J].電信快報,2012(10):10?16.
[3] 趙亮.使用Entity Framework 快速開發ASQ.NET網站[J].企業導報,2012(18):269?270.
[4] 黃睿.基于Java技術的ORM工具接口的設計與實現[D].長春:吉林大學,2012.
[5] LERMAN Julia, MILLER Rowan. Programming entity framework: DbContext [M]. America: O'Reilly Media, 2012.
[6] 謝日星.Entity Framework技術在分層架構中應用研究[J].電腦知識與技術,2011(15):3326?3327.
[7] LERMAN Julia, MILLER Rowan. Programming Entity Framework: code first [M]. America: O'Reilly Media, 2012.
文章標題:電子技術論文基于.NET Entity Framework數據庫訪問機制的設計
轉載請注明來自:http://www.optiwork.cn/fblw/dianxin/dianzijishu/24457.html
攝影藝術領域AHCI期刊推薦《Phot...關注:107
Nature旗下多學科子刊Nature Com...關注:152
中小學教師值得了解,這些教育學...關注:47
2025年寫管理學論文可以用的19個...關注:192
測繪領域科技核心期刊選擇 輕松拿...關注:64
及時開論文檢索證明很重要關注:52
中國水產科學期刊是核心期刊嗎關注:54
國際出書需要了解的問題解答關注:58
合著出書能否評職稱?關注:48
電信學有哪些可投稿的SCI期刊,值...關注:66
通信工程行業論文選題關注:73
SCIE、ESCI、SSCI和AHCI期刊目錄...關注:121
評職稱發論文好還是出書好關注:68
復印報刊資料重要轉載來源期刊(...關注:51
英文期刊審稿常見的論文狀態及其...關注:69
電子信息論文范文
智能科學技術論文 廣播電視論文 光電技術論文 計算機信息管理論文 計算機網絡論文 計算機應用論文 通信論文 信息安全論文 微電子應用論文 電子技術論文 生物醫學工程論文 軟件開發論文
SCI期刊分析
copyright © www.optiwork.cn, All Rights Reserved
搜論文知識網 冀ICP備15021333號-3