999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于.NET Entity Framework數據庫訪問機制的設計與應用

2014-12-18 17:57:27沈霞菲王建中
現代電子技術 2014年24期
關鍵詞:數據庫

沈霞菲+王建中

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

關鍵詞: 實體框架; 泛型類型; 接口; 數據庫

中圖分類號: TN911?34; TP392 ? ? ? ? ? ? ? ?文獻標識碼: A ? ? ? ? ? ? ? ? ? ? 文章編號: 1004?373X(2014)24?0005?04

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

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

本文設計的數據庫訪問層解決了以上問題,它與業務邏輯低耦合,使用簡單,以高度封裝的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期\Image\17T5.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.

[8] 趙增敏,吳潔,唐惠康.基于Code First模式的ASP.NET MVC應用開發[J].制造業自動化,2012,34(3):154?156.

}

打開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期\Image\17T5.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.

[8] 趙增敏,吳潔,唐惠康.基于Code First模式的ASP.NET MVC應用開發[J].制造業自動化,2012,34(3):154?156.

}

打開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期\Image\17T5.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.

[8] 趙增敏,吳潔,唐惠康.基于Code First模式的ASP.NET MVC應用開發[J].制造業自動化,2012,34(3):154?156.

猜你喜歡
數據庫
數據庫
財經(2017年15期)2017-07-03 22:40:49
數據庫
財經(2017年2期)2017-03-10 14:35:35
兩種新的非確定數據庫上的Top-K查詢
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
數據庫
財經(2015年3期)2015-06-09 17:41:31
數據庫
財經(2014年21期)2014-08-18 01:50:18
數據庫
財經(2014年6期)2014-03-12 08:28:19
數據庫
財經(2013年6期)2013-04-29 17:59:30
主站蜘蛛池模板: 又粗又大又爽又紧免费视频| 国产精品成人一区二区| 亚洲国产亚洲综合在线尤物| 亚洲高清无在码在线无弹窗| 亚洲免费人成影院| 一级毛片免费播放视频| 精品一区二区三区视频免费观看| 国产欧美自拍视频| 色婷婷在线播放| 精品无码国产一区二区三区AV| 99re视频在线| 四虎成人精品| 成人国产免费| a级毛片一区二区免费视频| 久久久久久久久久国产精品| 99久久这里只精品麻豆| 日本久久网站| 一级毛片基地| 国产95在线 | 国产成人一级| 中国成人在线视频| 国产美女91呻吟求| 欧美日韩中文国产| 国产美女久久久久不卡| 国产一区成人| 亚洲无码高清视频在线观看| 日韩精品无码不卡无码| 91亚洲免费视频| 午夜视频免费试看| 欧美精品一二三区| 国产91丝袜| 欧美亚洲欧美| 亚洲床戏一区| 久久综合九九亚洲一区| 国产视频欧美| 日韩亚洲综合在线| 这里只有精品在线| 日韩黄色在线| 超级碰免费视频91| 99热这里只有成人精品国产| 久久精品视频一| 精品视频一区二区观看| 亚洲香蕉久久| av在线5g无码天天| 亚洲中文字幕97久久精品少妇| 亚洲日本中文字幕乱码中文| 亚洲天堂伊人| 免费全部高H视频无码无遮掩| 亚洲av成人无码网站在线观看| 欧美精品一区二区三区中文字幕| 2021国产精品自拍| 亚洲va精品中文字幕| 永久免费AⅤ无码网站在线观看| 国产成a人片在线播放| 亚洲欧美精品在线| 欧美黄网站免费观看| 爆乳熟妇一区二区三区| 欧美日本在线观看| 亚洲乱伦视频| 日韩不卡高清视频| 国模私拍一区二区| 少妇人妻无码首页| 一级毛片无毒不卡直接观看| 一本大道AV人久久综合| 免费观看亚洲人成网站| 国产办公室秘书无码精品| 成人91在线| 国产噜噜噜| 国产鲁鲁视频在线观看| 国产黑丝视频在线观看| 三级国产在线观看| www.亚洲一区| 日a本亚洲中文在线观看| 国产永久在线观看| 全部毛片免费看| Aⅴ无码专区在线观看| 在线观看亚洲成人| 国产99在线观看| 九九久久精品免费观看| 国产成人免费手机在线观看视频| 欧美午夜一区| 青青青伊人色综合久久|