色偷偷伊人-色偷偷综合-色无五月-色香蕉影院-色亚洲影院

電子技術(shù)論文基于.NET Entity Framework數(shù)據(jù)庫訪問機(jī)制的設(shè)計

所屬欄目:電子技術(shù)論文 發(fā)布日期:2014-12-22 14:33 熱度:

  企業(yè)在開發(fā)軟件的過程中,為提升開發(fā)效率和增加技術(shù)積累,對不同的項(xiàng)目需求提取出一些共同的框架,數(shù)據(jù)庫訪問層便是其中之一。目前有很多好地 ORM[1?2](對象關(guān)系映射機(jī)制)框架已經(jīng)很好地實(shí)現(xiàn)了數(shù)據(jù)訪問層,而且得到了很廣泛的應(yīng)用,但由于許多公司技術(shù)人員水平有限,提取的數(shù)據(jù)庫訪問層和業(yè)務(wù)邏輯層的耦合程度不高,對開發(fā)效率上的提升不夠明顯[3]。

  摘 要: Entity Framework技術(shù)因其靈活、開發(fā)周期短等優(yōu)點(diǎn),被廣泛運(yùn)用到.NET平臺開發(fā)中。基于Entity Framework框架設(shè)計一個典型MVC架構(gòu)中的數(shù)據(jù)庫訪問層,運(yùn)用Entity Framework框架中的Code First方式結(jié)合泛型、封裝、單例模式等技術(shù),實(shí)現(xiàn)實(shí)體類映射到數(shù)據(jù)庫表并自動往數(shù)據(jù)庫建表的功能,并對每個實(shí)體類自動向外發(fā)布了增、刪、改、查4種操作方法,編譯成DLL庫文件以插件的形式供業(yè)務(wù)邏輯層調(diào)用,達(dá)到與業(yè)務(wù)邏輯和數(shù)據(jù)庫完全解耦。

  關(guān)鍵詞:電子技術(shù)論文, 實(shí)體框架,泛型類型,接口,數(shù)據(jù)庫

  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 引 言

  本文設(shè)計的數(shù)據(jù)庫訪問層解決了以上問題,它與業(yè)務(wù)邏輯低耦合,使用簡單,以高度封裝的DLL形式調(diào)用,可以節(jié)省大量的對數(shù)據(jù)庫存取的繁瑣操作,程序員能從數(shù)據(jù)庫存取中解脫出來專注于業(yè)務(wù)邏輯的設(shè)計。

  1 相關(guān)技術(shù)

  1.1 Entity Framework

  實(shí)體框架,是一種對象關(guān)系映射機(jī)制(ORM),能夠減少.NET Framework開發(fā)人員面向?qū)ο缶幊汰h(huán)境與關(guān)系數(shù)據(jù)庫環(huán)境之間的不匹配情形[4],使開發(fā)人員基本上可以通過熟悉的面向?qū)ο蟮募夹g(shù)來與應(yīng)用程序的概念模型進(jìn)行交互[5]。在實(shí)體框架中,開發(fā)人員能夠以特定于域的對象和屬性(如客戶和客戶地址)形式使用數(shù)據(jù),而不必考慮存儲此數(shù)據(jù)的基礎(chǔ)數(shù)據(jù)庫表和列。開發(fā)人員可以對概念模型發(fā)出數(shù)據(jù)訪問操作,然后實(shí)體框架會將該操作轉(zhuǎn)換為關(guān)系數(shù)據(jù)庫操作。

  1.2 Code First

  Code First是基于Entity Framework的新的開發(fā)模式,原來只有Database First和Model First兩種[6]。Code First顧名思義,就是先用C#/VB.NET的類定義好領(lǐng)域模型(實(shí)體類),然后用這些類映射到現(xiàn)有的數(shù)據(jù)庫表或者自動產(chǎn)生新的數(shù)據(jù)庫表。Code First同樣支持通過Data Annotations或fluent API進(jìn)行定制化配置[7]。其中Entity Framework庫里面的DbContext基類為操控實(shí)體對象執(zhí)行上下文環(huán)境,提供所需的架構(gòu)和映射元數(shù)據(jù)(Meatadata)、數(shù)據(jù)庫鏈接,同時還包括對象緩存、跟蹤狀態(tài)和關(guān)聯(lián)管理等功能[8]。使用時,定義一個繼承于DbContext的類,在該類里面配置好需要映射到數(shù)據(jù)庫表的各實(shí)體類。配置好后,這個類就成為了業(yè)務(wù)邏輯層里實(shí)體類和數(shù)據(jù)庫表交互的中間模型。   2 數(shù)據(jù)庫訪問機(jī)制設(shè)計

  2.1 總體設(shè)計框架

  數(shù)據(jù)庫訪問層是搭建在.NET Entity Framework框架的Code First方式之上的,將映射到數(shù)據(jù)庫表的各實(shí)體類通過DbContext類的擴(kuò)展類配置好后,這個擴(kuò)展類負(fù)責(zé)這些實(shí)體類與數(shù)據(jù)庫表的交互,這些實(shí)體類便共用了這個執(zhí)行上下文環(huán)境。當(dāng)不需要定制復(fù)雜的映射關(guān)系(大部分情況下)時,可以直接以dll的形式使用本模塊,這么做實(shí)際上是每個實(shí)體類通過一個 DbContext類的擴(kuò)展類映射到數(shù)據(jù)庫,即每個實(shí)體類獨(dú)立一個執(zhí)行上下文環(huán)境,將實(shí)體類泛型化,每個實(shí)體類通過泛型類型傳入數(shù)據(jù)訪問層,該層會通過層層調(diào)用自動生成對應(yīng)的DbContext類的擴(kuò)展類(執(zhí)行上下文)。當(dāng)需要進(jìn)行定制化配置時,可以重寫 DataContextService,DataContextProvider,DataContext三個抽象類,手動進(jìn)行實(shí)體類的配置,并在配置文件里配置好關(guān)系。可見本模塊的可擴(kuò)展性比較好。

  如圖1所示,該數(shù)據(jù)庫訪問模塊邏輯上又分三層:基礎(chǔ)服務(wù)層、倉儲層、數(shù)據(jù)訪問層。基礎(chǔ)服務(wù)層,該層通過讀取配置文件信息獲得對應(yīng)倉儲的程序集名和類型名,然后通過“反射”獲取該倉儲類型的對象。倉儲層,提供對應(yīng)不同數(shù)據(jù)庫(SQL Server、Oracle等)的數(shù)據(jù)庫訪問層。數(shù)據(jù)庫訪問層,直接與數(shù)據(jù)庫相連并對外提供增、刪、改、查等底層方法以供頂層調(diào)用,這里采用了微軟的 Code First框架來實(shí)現(xiàn)對數(shù)據(jù)庫的直接訪問,也就是數(shù)據(jù)訪問層。其中,基礎(chǔ)服務(wù)層和倉儲層都繼承了同一個接口IDataContextProvider,該接口在倉儲層得以實(shí)現(xiàn),從而實(shí)現(xiàn)了業(yè)務(wù)邏輯層、數(shù)據(jù)庫訪問層、數(shù)據(jù)庫三者之間的解耦。

  2.2 基礎(chǔ)服務(wù)層

  基礎(chǔ)服務(wù)層提供數(shù)據(jù)庫訪問層對外接口的定義和對內(nèi)數(shù)據(jù)訪問的管理,是業(yè)務(wù)邏輯層和數(shù)據(jù)庫訪問在邏輯上的中間連接層。

  如圖2所示,DataContextService為基礎(chǔ)服務(wù)層的核心抽象類,業(yè)務(wù)邏輯層(如:DomainObjectContext Service類)實(shí)現(xiàn)該類型,以訪問該業(yè)務(wù)邏輯模塊所提供的數(shù)據(jù)相關(guān)的操作。各個業(yè)務(wù)層模塊針對自身模塊的數(shù)據(jù)訪問服務(wù),必須繼承于該類。并重寫配置文件ConfigurationGuid,就可以實(shí)現(xiàn)通過配置文件探查到數(shù)據(jù)訪問層。本類為業(yè)務(wù)層和數(shù)據(jù)訪問層解耦提供基礎(chǔ)服務(wù)。該類實(shí)現(xiàn)了 IDataContextService接口,IDataContextService接口中定義了一個GetRepository()方法返回了一個 Repository泛型對象,該對象封裝了對數(shù)據(jù)庫的增、刪、改、查方法,并繼承了IQueryable即支持linq查詢。

  DataContextService里面ConfigureSectionName是配置文件配置節(jié)的名稱。當(dāng)實(shí)現(xiàn) DataContextService的擴(kuò)展類探查到數(shù)據(jù)庫訪問層后,將返回的倉儲對象與自己索引起來存入Dictionary(索引容器)里面,下次探查對應(yīng)倉儲對象時就不需要再通過反射獲取對象,這樣可以提高代碼運(yùn)行效率,本文的設(shè)計中多次用到這種方式來提升模塊性能。返回的倉儲對象才真正實(shí)現(xiàn)GetRepository()方法。

  2.3 倉儲層

  倉儲層為基礎(chǔ)服務(wù)層提供對應(yīng)服務(wù),Code first是以Dbcontext模型為容器把實(shí)體對象和數(shù)據(jù)庫建立起鏈接的,不同的實(shí)體對象可能屬于不同的容器,倉儲層就實(shí)現(xiàn)了具體的實(shí)體對象和對應(yīng)的Dbcontext模型索引。

  如圖3所示,DataContextProvider為倉儲層的核心抽象類,實(shí)際的倉儲類(如DomainObjectContext Provider類)繼承該類型并實(shí)現(xiàn)CreateDbContextCore()虛方法,以提供該倉儲類對應(yīng)數(shù)據(jù)庫訪問層即對應(yīng)的DbContext的擴(kuò)展類。DbContext的擴(kuò)展類是讀數(shù)據(jù)庫訪問方法的最終提供者,EFRepository 類通過傳入不同的DbContext擴(kuò)展類實(shí)現(xiàn)了IRepository接口。

  圖3 倉儲層結(jié)構(gòu)

  2.4 數(shù)據(jù)訪問層

  數(shù)據(jù)訪問層實(shí)現(xiàn)了一套對不同的實(shí)體對象自動生成對應(yīng)Dbcontext模型的機(jī)制,這樣外部業(yè)務(wù)邏輯層使用本模塊,通過泛型參數(shù)傳入實(shí)體類型,該機(jī)制就會對其自動生成屬于這個實(shí)體的Dbcontext模型。

  如圖4所示,該層基于EF的Code first方式配置模型實(shí)現(xiàn)對數(shù)據(jù)庫的訪問,DbContext繼承DbContext,重寫了數(shù)據(jù)庫鏈接字符串,并修改了EF庫對多個DbContext擴(kuò)展類訪問同一數(shù)據(jù)庫沖突的漏洞,且實(shí)現(xiàn)了數(shù)據(jù)遷移特性即當(dāng)實(shí)體類里有字段變化時,這種變化能自動移植到對應(yīng)的數(shù)據(jù)表列。然后用戶可以繼承DbContext類根據(jù)自身的需求配置不同的實(shí)體對象執(zhí)行上下文環(huán)境,并向上提供給對應(yīng)倉儲類。目前DbContext已支持Sqlserver之外的數(shù)據(jù)庫如Oracle,所以通過配置甚至可以實(shí)現(xiàn)對Oracle數(shù)據(jù)庫的訪問支持。

  3 應(yīng)用研究

  本文實(shí)現(xiàn)的數(shù)據(jù)庫訪問模塊主要目的在于實(shí)際應(yīng)用,為了更直接地展示其使用的快捷、簡單,下面通過實(shí)際例子加以說明。

  圖4 數(shù)據(jù)訪問層

  先定義一個實(shí)體類Person,繼承于DomainObject。這里DomainObject類只有一個Guid類型的字段。本模塊設(shè)計時對實(shí)體類做出了限制:任何實(shí)體類只有繼承于DomainObject類才能被映射到數(shù)據(jù)庫。

  public class Person:DomainObject {

  public string Name { get; set; }

  public int Age { get; set; }   }

  打開VS開發(fā)環(huán)境,建立一個控制臺應(yīng)用,添加以下代碼:

  DomainObjectDataContextService.UsingDataContext( );

  Person me = new Person( ) { Name="張三",Age=24};

  using (var persons = DomainObjectDataContextService.Instance.GetRepository( )){

  persons.Add(me);

  persons.Save( );

  }

  如圖5所示,在這段代碼執(zhí)行之前在數(shù)據(jù)庫里沒有任何數(shù)據(jù)庫以及表。運(yùn)行之后,在數(shù)據(jù)庫里可以看到如圖6結(jié)果,增加了YUNGO_SYS_DB2數(shù)據(jù)庫和People數(shù)據(jù)表以及一條新的記錄。

  <\192.168.6.11現(xiàn)代電子技術(shù)14年37卷第24期Image17T5.tif>

  圖5 執(zhí)行前數(shù)據(jù)庫

  刪除記錄操作代碼示例:

  using (var persons = DomainObjectDataContextService.Instance.GetRepository()){

  var p = from person in persons

  where person.Name == "張三"

  select person;

  persons.Remove(p.First());

  persons.Save();

  }

  查詢數(shù)據(jù)庫操作代碼示例

  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(); }

  總的來說,通過實(shí)體框架的對象層,可以執(zhí)行以下任務(wù):針對概念模型運(yùn)行查詢;跟蹤針對對象做所需的更改;將對象更改傳播回數(shù)據(jù)源;將對象綁定到控件。

  圖6 執(zhí)行后數(shù)據(jù)庫

  4 結(jié) 語

  本文詳細(xì)分析了數(shù)據(jù)庫訪問機(jī)制的各部分結(jié)構(gòu),并介紹了應(yīng)用方法。該機(jī)制缺點(diǎn)是不支持存儲過程,優(yōu)點(diǎn)是在進(jìn)行數(shù)據(jù)庫操作時不需要建表,大量需要手動書寫代碼配置的映射關(guān)系通過泛型可以自動生成;高度封裝對外公開有限接口,所以使用時操作簡單;代碼結(jié)構(gòu)清晰,各部分模塊化程度高,繼承體系完美,所以擴(kuò)展性強(qiáng),對于需定制的映射關(guān)系,修改方便。

  參考文獻(xiàn)

  [1] 袁立國,陳中育,李方鵬,等.一種軟件開發(fā)框架的設(shè)計優(yōu)化[J].計算機(jī)系統(tǒng)應(yīng)用,2013,22(5):70?74.

  [2] 盧小垂.基于.NET平臺的ORM輕量級開發(fā)框架的設(shè)計與實(shí)現(xiàn)[J].電信快報,2012(10):10?16.

  [3] 趙亮.使用Entity Framework 快速開發(fā)ASQ.NET網(wǎng)站[J].企業(yè)導(dǎo)報,2012(18):269?270.

  [4] 黃睿.基于Java技術(shù)的ORM工具接口的設(shè)計與實(shí)現(xiàn)[D].長春:吉林大學(xué),2012.

  [5] LERMAN Julia, MILLER Rowan. Programming entity framework: DbContext [M]. America: O'Reilly Media, 2012.

  [6] 謝日星.Entity Framework技術(shù)在分層架構(gòu)中應(yīng)用研究[J].電腦知識與技術(shù),2011(15):3326?3327.

  [7] LERMAN Julia, MILLER Rowan. Programming Entity Framework: code first [M]. America: O'Reilly Media, 2012.

文章標(biāo)題:電子技術(shù)論文基于.NET Entity Framework數(shù)據(jù)庫訪問機(jī)制的設(shè)計

轉(zhuǎn)載請注明來自:http://www.anghan.cn/fblw/dianxin/dianzijishu/24457.html

相關(guān)問題解答

SCI服務(wù)

搜論文知識網(wǎng) 冀ICP備15021333號-3

主站蜘蛛池模板: 欧洲成品大片在线播放 | 亚洲精品麻豆一区二区 | 91在线免费看 | 免费三级毛片 | 国产剧情精品在线 | 午夜精品aaa国产福利 | 亚洲va欧美va国产 | 国产精品吹潮在线播放 | 黄色福利片 | 国产草| 1024手机在线 | 国产特级毛片 | 欧美另类亚洲一区二区 | 看欧美黄色片 | 一级免费毛片 | 欧美黄色性 | 日本高清xxxx免费视频 | 亚洲欧美v视色一区二区 | 日本在线精品视频 | 成人国产精品免费软件 | 国产高颜值露脸在线观看 | 亚洲成年看片在线观看男男 | 嗯~啊~哦~别~别停~啊黑人 | 国产高清在线看免费视频观 | 国产婷婷综合在线视频 | 日本大片在线播放 | 激情亚洲综合网 | 性生活视频网站 | 狠狠色丁香婷婷综合 | 国内不卡一二三四区 | 亚洲人人在线 | 日本毛片在线看 | 国产精品久久久久9999 | 国产1区二区 | 亚洲五月综合缴情婷婷 | 欧美成人一区二区三区不卡 | 久草视频福利在线观看 | 亚洲第一免费 | 91入口免费网站大全 | 香蕉视频在线观看黄 | 91寡妇天天综合久久影院 |