林佳一

摘 要: 面對日益龐大且復(fù)雜的應(yīng)用系統(tǒng),傳統(tǒng)的數(shù)據(jù)訪問技術(shù)存在開發(fā)效率低、安全性弱和兼容性差等問題。為了進(jìn)一步快速構(gòu)建一個功能強大的系統(tǒng),Entity Framework數(shù)據(jù)模型這一新技術(shù)應(yīng)運而生,該技術(shù)基于ORM框架,融合了面向?qū)ο蟮乃季S方式。將EF技術(shù)應(yīng)用在三層架構(gòu)的進(jìn)銷存管理系統(tǒng),程序員可不再拘泥于SQL語句細(xì)節(jié),而是重點關(guān)注程序邏輯的實現(xiàn)。EF技術(shù)的使用大大縮短了開發(fā)周期,有助于更有效地使用數(shù)據(jù)。
關(guān)鍵詞: Entity Framework; ORM; 三層架構(gòu); SQL
中圖分類號:TP311 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2018)03-38-04
Research on the application of EF technology in inventory management system
Lin Jiayi
(GuangDong Communication Polytechnic, Guangzhou, Guangdong 510650, China)
Abstract: Facing the increasingly large and complex application system,traditional data access technology has many problems, such as low development efficiency, weak security and poor compatibility. In order to further build a powerful system quickly, the new technology of Entity Framework data model came into being. This technology is based on the ORM framework, and integrates the object-oriented way of thinking. The application of EF technology in a three-tier architecture of inventory management system, the programmers can no longer get bogged down in the details of SQL statements, but rather focus on the realization of program logic. The application of EF technology greatly shortens the development cycle and helps to use data more effectively.
Key words: Entity Framework; ORM; three-tier architecture; SQL
0 引言
隨著大數(shù)據(jù)時代的到來,人們普遍關(guān)注如何應(yīng)用信息化的手段高效地管理和使用數(shù)據(jù)。無論單位規(guī)模大小,都建有獨立的信息系統(tǒng)來管理自己重要的數(shù)據(jù)。在實現(xiàn)這些系統(tǒng)的過程中,數(shù)據(jù)的訪問技術(shù)直接決定著系統(tǒng)使用數(shù)據(jù)的質(zhì)量和效率。盡管在設(shè)計思想上,從二層結(jié)構(gòu)、三層結(jié)構(gòu)到N層結(jié)構(gòu)的分層開發(fā)模式對提高系統(tǒng)的開發(fā)速度效果明顯,但在數(shù)據(jù)訪問方面還有進(jìn)一步提升的空間。
業(yè)界需要一種數(shù)據(jù)訪問技術(shù),它對用戶而言希望快速有效獲取數(shù)據(jù),對開發(fā)者而言希望容易掌握。EF技術(shù)的出現(xiàn)為滿足這些要求提供了一種新的方案。EF技術(shù)是由傳統(tǒng)的數(shù)據(jù)訪問技術(shù)發(fā)展而來,是ORM框架的具體實現(xiàn),解決了關(guān)系表到實體類的轉(zhuǎn)換問題,使程序員從面向?qū)ο蟮慕嵌壬喜僮鲾?shù)據(jù)庫。本文通過分析EF技術(shù)原理,結(jié)合三層架構(gòu)開發(fā)模式,探討了在進(jìn)銷存管理系統(tǒng)中應(yīng)用EF技術(shù)的方法。
1 相關(guān)技術(shù)概述
1.1 ORM框架
較長一段時間內(nèi),應(yīng)用系統(tǒng)的程序設(shè)計使用的是面向?qū)ο蠹夹g(shù),而數(shù)據(jù)庫的設(shè)計依然沿用的是面向集合關(guān)系模型,因此在開發(fā)中程序員需要將關(guān)系模型轉(zhuǎn)換為對象實體以便代碼訪問,這大大加重了程序員的工作負(fù)擔(dān)。為了讓程序員專注于業(yè)務(wù)代碼,ORM框架應(yīng)運而生。ORM(Object Relation Mapping)全稱為對象關(guān)系映射。O指編程語言中相應(yīng)的類,R指關(guān)系數(shù)據(jù)庫中的二維表,M是指關(guān)系和對象之間的映射[1]。通過這種映射,ORM框架將關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)表用類的形式表現(xiàn)出來,這樣程序員只需要通過操作類來操作數(shù)據(jù)庫而無須再寫復(fù)雜的SQL語句。
1.2 EF數(shù)據(jù)模型
實體框架(Entity Framework)簡稱為EF,是微軟針對其.NET平臺推出的一種基于ORM技術(shù)的具體實現(xiàn)方案。自從在Visual Studio 2010中首次使用以來,歷經(jīng)多年完善,如今已經(jīng)成為開發(fā)數(shù)據(jù)庫應(yīng)用程序的相對成熟技術(shù)。
EF技術(shù)的核心是實體數(shù)據(jù)模型(Entity Data Model)簡稱為EDM,它由三部分組成,概念層、映射層和存儲層[2]。概念層是抽象的,指應(yīng)用程序涉及的實體類和關(guān)系;存儲層是具體的實現(xiàn),指數(shù)據(jù)庫中的表;映射層主要完成數(shù)據(jù)表和實體對象之間轉(zhuǎn)換,這種映射是雙向的,它能將數(shù)據(jù)表轉(zhuǎn)換成.NET實體對象,也可以將.NET實體對象轉(zhuǎn)換成數(shù)據(jù)表。在Visual Studio的項目中使用EF數(shù)據(jù)模型時,EDM具體的實現(xiàn)形式是一個后綴名為edmx的文件。這是一個用xml的格式描述元數(shù)據(jù)的文件,其中有三個重要的節(jié)點
EF提供了三種用戶端來訪問EDM,分別是Entity Client、Object Context和LINQ to Entities。無論是哪種用戶端,EDM 中的數(shù)據(jù)提供者在數(shù)據(jù)源和用戶端之間傳遞著數(shù)據(jù),整個訪問過程本質(zhì)上都會轉(zhuǎn)換為SQL語句,SQL語句中所操作的表和字段都來自于對.edmx元數(shù)據(jù)文件的解析結(jié)果,而最后的操作都會交給ADO.NET完成。因此可以認(rèn)為EF是在ADO.NET的基礎(chǔ)上對數(shù)據(jù)的操作細(xì)節(jié)所做的進(jìn)一步封裝。
根據(jù)不同的系統(tǒng)開發(fā)場景,使用EF技術(shù)時有三種開發(fā)方式[3],如圖1所示。第一種方式:模型優(yōu)先(Model First),首先需要在Visual Studio中創(chuàng)建實體類模型,然后按照EDM中的映射規(guī)則,系統(tǒng)自動生成數(shù)據(jù)庫的表和相關(guān)腳本。這種方式適用的情況是開發(fā)時還未建好數(shù)據(jù)庫,或者在開發(fā)過程中需要頻繁通過修改實體類模型來更新數(shù)據(jù)庫;第二種方式是數(shù)據(jù)庫優(yōu)先(DataBase First),先創(chuàng)建數(shù)據(jù)庫,再將數(shù)據(jù)表轉(zhuǎn)換為實體類模型,并編寫代碼來訪問將數(shù)據(jù)表。此方式從搭建數(shù)據(jù)庫起步,符合傳統(tǒng)的系統(tǒng)開發(fā)思維,開發(fā)者容易掌握;第三種方式是代碼優(yōu)先(Code First),開發(fā)者先寫實體類代碼,通過創(chuàng)建類的對象,自動將對應(yīng)的表生成到數(shù)據(jù)庫中,并可以通過數(shù)據(jù)庫自動生成實體類模型。該方式比較適合精通面向?qū)ο缶幊潭皇煜?shù)據(jù)庫語句的開發(fā)者,或者數(shù)據(jù)庫規(guī)模較小。
1.3 三層架構(gòu)
大部分?jǐn)?shù)據(jù)庫應(yīng)用系統(tǒng)代碼中都包括界面設(shè)計程序、邏輯判斷程序和數(shù)據(jù)訪問程序。如果這些代碼全部混雜在一起,當(dāng)數(shù)據(jù)庫系統(tǒng)或用戶界面發(fā)生改變時,則需要重新開發(fā)整個系統(tǒng)。為了方便系統(tǒng)的修改和重構(gòu),無論是部署在C/S(Client/Server)還是B/S(Browser/Server)之上的軟件項目,都廣泛應(yīng)用了三層架構(gòu)開發(fā)模式。
三層分別指UI層(表示層)、BLL層(業(yè)務(wù)邏輯層)和DAL層(數(shù)據(jù)訪問層)[4]。UI層位于最上層,主要是界面的設(shè)計;BLL層在UI層和DAL層之間,負(fù)責(zé)數(shù)據(jù)處理和傳遞;DAL層功能主要是負(fù)責(zé)數(shù)據(jù)庫的訪問。三層各司其職、相互合作完成系統(tǒng)功能。三層之間傳遞數(shù)據(jù)顯然不能直接是數(shù)據(jù)表,而是面向?qū)ο蟪绦蛟O(shè)計語言中的實體類表示,于是,需要將表中的數(shù)據(jù)轉(zhuǎn)換成一個實體類的對象的集合。
2 在系統(tǒng)中使用EF技術(shù)的原因
目前,在基于.NET平臺上的WinForm、Asp.Net、Asp.Net MVC、WCF等各種應(yīng)用程序中都廣泛采用了EF技術(shù)。EF技術(shù)之所以備受關(guān)注并成為數(shù)據(jù)訪問領(lǐng)域的主流,主要原因如下:
⑴ 能與多種數(shù)據(jù)庫管理系統(tǒng)無縫整合,有利于系統(tǒng)的更新和擴展
EF作為一個輕量級的數(shù)據(jù)訪問框架不僅應(yīng)用于SQL Server數(shù)據(jù)庫,還可以支持Oracle、MySQL和 SQLite等各種的數(shù)據(jù)庫。雖然這些數(shù)據(jù)庫的SQL語句存在一定的差異,但對于使用了EF技術(shù)的應(yīng)用程序而言,通過EDM的映射,在訪問數(shù)據(jù)庫的操作中屏蔽了這些不一致,這樣使得更換數(shù)據(jù)庫系統(tǒng)變得更加靈活。
⑵ EF技術(shù)與三層架構(gòu)中的實體類相互融合,減少了數(shù)據(jù)傳遞的代碼量
在三層架構(gòu)的應(yīng)用程序中,三層之間通過實體類來傳遞數(shù)據(jù),實體類的一個對象對應(yīng)二維表里的一行數(shù)據(jù),實體類的每個屬性對應(yīng)表中的相應(yīng)字段。EF中所用到的實體模型和關(guān)系數(shù)據(jù)庫表是一一對應(yīng),相互之間形成映射。
⑶ 符合面向?qū)ο蟮乃季S方式,易于程序員學(xué)習(xí)和使用
EF技術(shù)讓程序員直接用面向?qū)ο蟮木幊谭绞絹聿僮鲾?shù)據(jù),而不必拘泥于低層訪問數(shù)據(jù)庫代碼的細(xì)節(jié)。EF語法結(jié)合了LINQ代碼或lambda表達(dá)式,因此代碼非常簡潔,開發(fā)人員容易掌握。這些高度封裝的代碼最終由系統(tǒng)自動轉(zhuǎn)換為SQL語句。比如,對那些涉及多個表的操作,在EF中不用象在數(shù)據(jù)庫中那樣做聯(lián)表,而直接用導(dǎo)航屬性。EF中edmx元數(shù)據(jù)文件會讀取數(shù)據(jù)庫中的關(guān)系,然后根據(jù)表的主外鍵關(guān)系生成導(dǎo)航屬性。
⑷ 避免直接使用SQL語句,可以提高系統(tǒng)的安全性
EF技術(shù)除了用.NET支持的語言完成有關(guān)數(shù)據(jù)庫的增加、刪除、修改和查詢操作,還能很好地支持存儲過程,有效地防止SQL注入式攻擊,大大提高了應(yīng)用程序的安全性。
3 EF技術(shù)在進(jìn)銷存管理系統(tǒng)的應(yīng)用
隨著系統(tǒng)規(guī)模越來越龐大,功能越來越復(fù)雜,軟件項目開發(fā)需要很多人分工合作,三層架構(gòu)在系統(tǒng)開發(fā)中日益凸顯著重要作用。同時,針對三層架構(gòu)中的每一層的實現(xiàn)各自也有很多的方案,尤其是對DAL層,
.NET平臺的實現(xiàn)方法諸如ADO.NET,LINQ和EF等。EF作為微軟當(dāng)前最新數(shù)據(jù)存取技術(shù),將其運用在項目中可以極大地發(fā)揮三層架構(gòu)和EF各自的優(yōu)勢。下面以進(jìn)銷存管理系統(tǒng)為例,具體介紹EF技術(shù)在三層架構(gòu)系統(tǒng)中的應(yīng)用。該系統(tǒng)使用Visual Studio 2012和SQL Server2012,采用了數(shù)據(jù)庫優(yōu)先的開發(fā)方式。
3.1 系統(tǒng)設(shè)計
⑴ 功能分析
該進(jìn)銷存管理系統(tǒng)基于C/S體系結(jié)構(gòu),用于小型商業(yè)企業(yè)日常經(jīng)營業(yè)務(wù)[5]。主要包括六大功能模塊。①用戶管理,分為系統(tǒng)用戶和普通用戶;②基本信息管理,包括商品、供應(yīng)商、客戶和倉庫信息的錄入、修改、刪除和查詢;③進(jìn)貨管理,入庫單信息編輯;④銷售管理,銷售單信息的編輯;⑤庫存信息的管理,庫存的查詢和統(tǒng)計、庫存上下限預(yù)警;⑥決策分析,產(chǎn)品的銷量和庫存排行與分析。
⑵ 搭建系統(tǒng)三層架構(gòu)
按照分層的思想,在VS中構(gòu)建系統(tǒng)的三層架構(gòu)。首先新建“JXC”空白解決方案,在方案中添加“JXC”WIN窗體應(yīng)用程序項目、“JXCBLL”和“JXCDAL”類庫項目,它們分別表示UI層、BLL層和DAL層。三層之間傳遞的數(shù)據(jù)放在實體類組成的“MODEL”實體層中。UI層直接和用戶打交道,主要實現(xiàn)顯示系統(tǒng)的主菜單、銷售信息編輯等核心功能界面及界面之間的跳轉(zhuǎn)。BLL層原本是實現(xiàn)諸如登錄、銷售統(tǒng)計等業(yè)務(wù)的復(fù)雜邏輯,但這里只是通過對DAL層的方法調(diào)用來實現(xiàn)任務(wù),僅起到傳遞和響應(yīng)請求的作用。DAL層中實現(xiàn)了處理的各個實體類的方法。
3.2 實現(xiàn)EF數(shù)據(jù)訪問
⑴ 創(chuàng)建EF實體數(shù)據(jù)模型
在“MODEL”實體層項目中添加一個ADO.NET實體數(shù)據(jù)模型項,由于已經(jīng)有“jxc”數(shù)據(jù)庫,選擇“從數(shù)據(jù)庫生成”的方式,系統(tǒng)自動創(chuàng)建了jxc.edmx文件。jxc.edmx元數(shù)據(jù)文件保存了“jxc”數(shù)據(jù)庫、實體類和映射關(guān)系的相關(guān)信息。與以前ADO.NET三層架構(gòu)系統(tǒng)不同,EF會自動產(chǎn)生與數(shù)據(jù)庫中各個表所對應(yīng)的實體類。同時,還創(chuàng)建了數(shù)據(jù)庫上下文類文件jxc.Context.cs,該文件中有一個jxcEntities類,對應(yīng)于要訪問“jxc”數(shù)據(jù)庫,該類中為每個實體類定義了一個相關(guān)的實例屬性,屬性的類型是DbSet
⑵ DAL層使用EF實體數(shù)據(jù)模型
通常實體類會被系統(tǒng)的各層使用。在EF中通過jxcEntities對象的屬性來訪問要操作的表,如果要操作sell表就要操作對應(yīng)的sell屬性。數(shù)據(jù)的訪問操作代碼都封裝在DAL層,而此時EF自動產(chǎn)生的類在實體層,于是需要將實體層使用的EntityFramework程序集引入到DAL層,這樣才能在DAL層使用DbSet
3.3 ef關(guān)鍵代碼分析
UI層接收到用戶請求,UI層調(diào)用BLL層的方法進(jìn)行處理,其中需要操作數(shù)據(jù)庫的部分是由BLL層調(diào)用DAL層的方法完成。整個系統(tǒng)中最重要和最低層的代碼在DAL層。DAL層中把每個實體類相關(guān)的增加、刪除、修改和查詢的方法封裝在各自的類中。由于這些操作方法中間的邏輯代碼基本一致,只是處理的實體對象不同,因此,在DAL層抽象出一個DBDal泛型類,這個類的功能和基于ADO.NET三層系統(tǒng)中的SQLHelper通用數(shù)據(jù)操作類的功能相似,主要包括對基本增加、刪除、修改和查詢方法,此時方法并沒有確定針對哪個具體實體對象,DBDal泛型類部分代碼如下所示。
public class DBDal
{
jxcEntities db=new jxcEntities();
DbSet
//條件查詢
public IQueryable
{
return ds.Where(conditon);
}
//增加
public void Add(TEntity entity)
{
ds.Add(entity);
db.SaveChanges();
}
…
}
當(dāng)對某個實體類操作時,需要定義一個子類繼承DBDal泛型類。比如對應(yīng)銷售表的sell實體類操作的類為GoodsDAL: DBDal
3.4 注意的問題
雖然使用EF減輕了編程的工作量,且降低了代碼出錯率,但在應(yīng)用過程中有一些問題值得注意。第一,程序員往往需要修改從數(shù)據(jù)庫自動生成的實體類,此時不要在.cs文件中修改,而要修改tt模板,因為只要保存edmx文件,.cs文件就會回到未修改狀態(tài);第二,EF模型在DAL層實現(xiàn)時,數(shù)據(jù)庫的連接字符等配置保存在App.config文件中,而應(yīng)用程序首先啟動是UI層項目,因此要將
4 結(jié)束語
在基于三層架構(gòu)的進(jìn)銷存管理系統(tǒng)中,使用EF技術(shù),使得程序結(jié)構(gòu)更加清晰,不僅節(jié)省了項目的開發(fā)成本,而且縮短了開發(fā)周期。在當(dāng)前信息化時代背景下,EF技術(shù)將會廣泛應(yīng)用于系統(tǒng)開發(fā)中。但是EF技術(shù)也存在一些不足之處, EF的模式化編程方式往往束縛了它解決特殊問題的能力,當(dāng)面對復(fù)雜的業(yè)務(wù)邏輯時,開發(fā)者最終還是得使用SQL語句來實現(xiàn)功能。另外,還會出現(xiàn)系統(tǒng)運行速度較慢和無法保證數(shù)據(jù)的有效性等問題。因此,今后EF技術(shù)在性能優(yōu)化、事務(wù)處理和安全性方面還有待進(jìn)一步完善。
參考文獻(xiàn)(References):
[1] 高起躍.基于ASP_NETMVC和實體框架的農(nóng)業(yè)論壇的設(shè)計
與實現(xiàn)[D].遼寧科技大學(xué)碩士學(xué)位論文,2014.6.
[2] 謝日星.EntityFramework技術(shù)在分層架構(gòu)中的應(yīng)用研究[J].
電腦知識與技術(shù),2011.7(14):3326-3327
[3] 龔蘭蘭.基于ASP.net MVC的智能名片后臺系統(tǒng)的設(shè)計與
實現(xiàn)[J].蘇州市職業(yè)大學(xué)學(xué)報,2017.28(1):5-9
[4] 何福南,湯曉燕.C#程序設(shè)計項目化教程[M].電子工業(yè)出版
社,2014.
[5] 明日科技.C#項目開發(fā)案例全程實錄(第2版)[M].清華大學(xué)
出版社,2011.