前言:尋找寫作靈感?中文期刊網用心挑選的EF技術在進銷存管理系統的應用,希望能為您的閱讀和創作帶來靈感,歡迎大家閱讀并分享。
摘要:面對日益龐大且復雜的應用系統,傳統的數據訪問技術存在開發效率低、安全性弱和兼容性差等問題。為了進一步快速構建一個功能強大的系統,EntityFramework數據模型這一新技術應運而生,該技術基于ORM框架,融合了面向對象的思維方式。將ef技術應用在三層架構的進銷存管理系統,程序員可不再拘泥于SQL語句細節,而是重點關注程序邏輯的實現。EF技術的使用大大縮短了開發周期,有助于更有效地使用數據。
關鍵詞:EntityFramework;ORM;三層架構;SQL
0引言
隨著大數據時代的到來,人們普遍關注如何應用信息化的手段高效地管理和使用數據。無論單位規模大小,都建有獨立的信息系統來管理自己重要的數據。在實現這些系統的過程中,數據的訪問技術直接決定著系統使用數據的質量和效率。盡管在設計思想上,從二層結構、三層結構到N層結構的分層開發模式對提高系統的開發速度效果明顯,但在數據訪問方面還有進一步提升的空間。業界需要一種數據訪問技術,它對用戶而言希望快速有效獲取數據,對開發者而言希望容易掌握。EF技術的出現為滿足這些要求提供了一種新的方案。EF技術是由傳統的數據訪問技術發展而來,是ORM框架的具體實現,解決了關系表到實體類的轉換問題,使程序員從面向對象的角度上操作數據庫。本文通過分析EF技術原理,結合三層架構開發模式,探討了在進銷存管理系統中應用EF技術的方法。
1相關技術概述
1.1ORM框架
較長一段時間內,應用系統的程序設計使用的是面向對象技術,而數據庫的設計依然沿用的是面向集合關系模型,因此在開發中程序員需要將關系模型轉換為對象實體以便代碼訪問,這大大加重了程序員的工作負擔。為了讓程序員專注于業務代碼,ORM框架應運而生。ORM(ObjectRelationMapping)全稱為對象關系映射。O指編程語言中相應的類,R指關系數據庫中的二維表,M是指關系和對象之間的映射。通過這種映射,ORM框架將關系數據庫中的數據表用類的形式表現出來,這樣程序員只需要通過操作類來操作數據庫而無須再寫復雜的SQL語句。
1.2EF數據模型
實體框架(EntityFramework)簡稱為EF,是微軟針對其.NET平臺推出的一種基于ORM技術的具體實現方案。自從在VisualStudio2010中首次使用以來,歷經多年完善,如今已經成為開發數據庫應用程序的相對成熟技術。EF技術的核心是實體數據模型(EntityDataModel)簡稱為EDM,它由三部分組成,概念層、映射層和存儲層[2]。概念層是抽象的,指應用程序涉及的實體類和關系;存儲層是具體的實現,指數據庫中的表;映射層主要完成數據表和實體對象之間轉換,這種映射是雙向的,它能將數據表轉換成.NET實體對象,也可以將.NET實體對象轉換成數據表。在VisualStudio的項目中使用EF數據模型時,EDM具體的實現形式是一個后綴名為edmx的文件。這是一個用xml的格式描述元數據的文件,其中有三個重要的節點<edmx:ConceptualModels>、<edmx:Mapping>和<edmx:StorageModels>分別描述了概念層、映射層和存儲層。它不僅設置了概念層模型和存儲層模型的基本結構,還配置好了兩者之間的全部映射關系。EF提供了三種用戶端來訪問EDM,分別是EntityClient、ObjectContext和LINQtoEntities。無論是哪種用戶端,EDM中的數據提供者在數據源和用戶端之間傳遞著數據,整個訪問過程本質上都會轉換為SQL語句,SQL語句中所操作的表和字段都來自于對.edmx元數據文件的解析結果,而最后的操作都會交給ADO.NET完成。因此可以認為EF是在ADO.NET的基礎上對數據的操作細節所做的進一步封裝。根據不同的系統開發場景,使用EF技術時有三種開發方式[3],如圖1所示。第一種方式:模型優先(ModelFirst),首先需要在VisualStudio中創建實體類模型,然后按照EDM中的映射規則,系統自動生成數據庫的表和相關腳本。這種方式適用的情況是開發時還未建好數據庫,或者在開發過程中需要頻繁通過修改實體類模型來更新數據庫;第二種方式是數據庫優先(DataBaseFirst),先創建數據庫,再將數據表轉換為實體類模型,并編寫代碼來訪問將數據表。此方式從搭建數據庫起步,符合傳統的系統開發思維,開發者容易掌握;第三種方式是代碼優先(CodeFirst),開發者先寫實體類代碼,通過創建類的對象,自動將對應的表生成到數據庫中,并可以通過數據庫自動生成實體類模型。該方式比較適合精通面向對象編程而不熟悉數據庫語句的開發者,或者數據庫規模較小。
1.3三層架構
大部分數據庫應用系統代碼中都包括界面設計程序、邏輯判斷程序和數據訪問程序。如果這些代碼全部混雜在一起,當數據庫系統或用戶界面發生改變時,則需要重新開發整個系統。為了方便系統的修改和重構,無論是部署在C/S(Client/Server)還是B/S(Browser/Server)之上的軟件項目,都廣泛應用了三層架構開發模式。三層分別指UI層(表示層)、BLL層(業務邏輯層)和DAL層(數據訪問層)[4]。UI層位于最上層,主要是界面的設計;BLL層在UI層和DAL層之間,負責數據處理和傳遞;DAL層功能主要是負責數據庫的訪問。三層各司其職、相互合作完成系統功能。三層之間傳遞數據顯然不能直接是數據表,而是面向對象程序設計語言中的實體類表示,于是,需要將表中的數據轉換成一個實體類的對象的集合。
2在系統中使用EF技術的原因
目前,在基于.NET平臺上的WinForm、Asp.Net、Asp.NetMVC、WCF等各種應用程序中都廣泛采用了EF技術。EF技術之所以備受關注并成為數據訪問領域的主流,主要原因如下:
⑴能與多種數據庫管理系統無縫整合,有利于系統的更新和擴展
EF作為一個輕量級的數據訪問框架不僅應用于SQLServer數據庫,還可以支持Oracle、MySQL和SQLite等各種的數據庫。雖然這些數據庫的SQL語句存在一定的差異,但對于使用了EF技術的應用程序而言,通過EDM的映射,在訪問數據庫的操作中屏蔽了這些不一致,這樣使得更換數據庫系統變得更加靈活。
⑵EF技術與三層架構中的實體類相互融合,減少了數據傳遞的代碼量
在三層架構的應用程序中,三層之間通過實體類來傳遞數據,實體類的一個對象對應二維表里的一行數據,實體類的每個屬性對應表中的相應字段。EF中所用到的實體模型和關系數據庫表是一一對應,相互之間形成映射。
⑶符合面向對象的思維方式,易于程序員學習和使用
EF技術讓程序員直接用面向對象的編程方式來操作數據,而不必拘泥于低層訪問數據庫代碼的細節。EF語法結合了LINQ代碼或lambda表達式,因此代碼非常簡潔,開發人員容易掌握。這些高度封裝的代碼最終由系統自動轉換為SQL語句。比如,對那些涉及多個表的操作,在EF中不用象在數據庫中那樣做聯表,而直接用導航屬性。EF中edmx元數據文件會讀取數據庫中的關系,然后根據表的主外鍵關系生成導航屬性。
⑷避免直接使用SQL語句,可以提高系統的安全性
EF技術除了用.NET支持的語言完成有關數據庫的增加、刪除、修改和查詢操作,還能很好地支持存儲過程,有效地防止SQL注入式攻擊,大大提高了應用程序的安全性。
3EF技術在進銷存管理系統的應用
隨著系統規模越來越龐大,功能越來越復雜,軟件項目開發需要很多人分工合作,三層架構在系統開發中日益凸顯著重要作用。同時,針對三層架構中的每一層的實現各自也有很多的方案,尤其是對DAL層,.NET平臺的實現方法諸如ADO.NET,LINQ和EF等。EF作為微軟當前最新數據存取技術,將其運用在項目中可以極大地發揮三層架構和EF各自的優勢。下面以進銷存管理系統為例,具體介紹EF技術在三層架構系統中的應用。該系統使用VisualStudio2012和SQLServer2012,采用了數據庫優先的開發方式。
3.1系統設計
⑴功能分析
該進銷存管理系統基于C/S體系結構,用于小型商業企業日常經營業務[5]。主要包括六大功能模塊。①用戶管理,分為系統用戶和普通用戶;②基本信息管理,包括商品、供應商、客戶和倉庫信息的錄入、修改、刪除和查詢;③進貨管理,入庫單信息編輯;④銷售管理,銷售單信息的編輯;⑤庫存信息的管理,庫存的查詢和統計、庫存上下限預警;⑥決策分析,產品的銷量和庫存排行與分析。
⑵搭建系統三層架構
按照分層的思想,在VS中構建系統的三層架構。首先新建“JXC”空白解決方案,在方案中添加“JXC”WIN窗體應用程序項目、“JXCBLL”和“JXCDAL”類庫項目,它們分別表示UI層、BLL層和DAL層。三層之間傳遞的數據放在實體類組成的“MODEL”實體層中。UI層直接和用戶打交道,主要實現顯示系統的主菜單、銷售信息編輯等核心功能界面及界面之間的跳轉。BLL層原本是實現諸如登錄、銷售統計等業務的復雜邏輯,但這里只是通過對DAL層的方法調用來實現任務,僅起到傳遞和響應請求的作用。DAL層中實現了處理的各個實體類的方法。
3.2實現EF數據訪問
⑴創建EF實體數據模型
在“MODEL”實體層項目中添加一個ADO.NET實體數據模型項,由于已經有“jxc”數據庫,選擇“從數據庫生成”的方式,系統自動創建了jxc.edmx文件。jxc.edmx元數據文件保存了“jxc”數據庫、實體類和映射關系的相關信息。與以前ADO.NET三層架構系統不同,EF會自動產生與數據庫中各個表所對應的實體類。同時,還創建了數據庫上下文類文件jxc.Context.cs,該文件中有一個jxcEntities類,對應于要訪問“jxc”數據庫,該類中為每個實體類定義了一個相關的實例屬性,屬性的類型是DbSet<TEntity>。
⑵DAL層使用EF實體數據模型
通常實體類會被系統的各層使用。在EF中通過jxcEntities對象的屬性來訪問要操作的表,如果要操作sell表就要操作對應的sell屬性。數據的訪問操作代碼都封裝在DAL層,而此時EF自動產生的類在實體層,于是需要將實體層使用的EntityFramework程序集引入到DAL層,這樣才能在DAL層使用DbSet<TEntity>的各種方法,同時由EF自動轉換成SQL代碼完成對數據庫的操作。
3.3ef關鍵代碼分析
UI層接收到用戶請求,UI層調用BLL層的方法進行處理,其中需要操作數據庫的部分是由BLL層調用DAL層的方法完成。整個系統中最重要和最低層的代碼在DAL層。DAL層中把每個實體類相關的增加、刪除、修改和查詢的方法封裝在各自的類中。由于這些操作方法中間的邏輯代碼基本一致,只是處理的實體對象不同,因此,在DAL層抽象出一個DBDal泛型類,這個類的功能和基于ADO.NET三層系統中的SQLHelper通用數據操作類的功能相似,主要包括對基本增加、刪除、修改和查詢方法,此時方法并沒有確定針對哪個具體實體對象,DBDal泛型類部分代碼如下所示。當對某個實體類操作時,需要定義一個子類繼承DBDal泛型類。比如對應銷售表的sell實體類操作的類為GoodsDAL:DBDal<Sell>。此時,不需要再在GoodsDAL類中定義基本操作方法,因為直接可以從父類DBDal中繼承獲得。在繼承DBDal<Sell>時確定了泛型類型,意味著方法操作的是sell實體類對象,經過EF的模型映射后轉換為用SQL語句操作數據庫中的sell表。
3.4注意的問題
雖然使用EF減輕了編程的工作量,且降低了代碼出錯率,但在應用過程中有一些問題值得注意。第一,程序員往往需要修改從數據庫自動生成的實體類,此時不要在.cs文件中修改,而要修改tt模板,因為只要保存edmx文件,.cs文件就會回到未修改狀態;第二,EF模型在DAL層實現時,數據庫的連接字符等配置保存在App.config文件中,而應用程序首先啟動是UI層項目,因此要將<configSections>、<connectionStrings>和<entityFramework>三個節點拷貝到UI層項目的App.config文件中;第三,EF訪問數據庫的實質是調用了IQueryable中的擴展方法,自動將這些方法轉換成SQL語句,EF程序易寫但執行效率較差,可以先在EF上下文中完成操作,再保存到數據庫,以獲得更優的性能。
4結束語
在基于三層架構的進銷存管理系統中,使用EF技術,使得程序結構更加清晰,不僅節省了項目的開發成本,而且縮短了開發周期。在當前信息化時代背景下,EF技術將會廣泛應用于系統開發中。但是EF技術也存在一些不足之處,EF的模式化編程方式往往束縛了它解決特殊問題的能力,當面對復雜的業務邏輯時,開發者最終還是得使用SQL語句來實現功能。另外,還會出現系統運行速度較慢和無法保證數據的有效性等問題。因此,今后EF技術在性能優化、事務處理和安全性方面還有待進一步完善。
參考文獻(References):
[1]高起躍.基于ASP_NETMVC和實體框架的農業論壇的設計與實現[D].遼寧科技大學碩士學位論文,2014.6.
[2]謝日星.EntityFramework技術在分層架構中的應用研究[J].電腦知識與技術,2011.7(14):3326-3327
[3]龔蘭蘭.基于ASP.netMVC的智能名片后臺系統的設計與實現[J].蘇州市職業大學學報,2017.28(1):5-9
[4]何福南,湯曉燕.C#程序設計項目化教程[M].電子工業出版社,2014.
[5]明日科技.C#項目開發案例全程實錄(第2版)[M].清華大學出版社,2011.
作者:林佳一 單位:廣東交通職業技術學院信息學院