劉文勝+劉博夫+朱寧
摘要:介紹了實體框架技術(shù)的基本原理與優(yōu)勢,通過實體框架技術(shù)訪問數(shù)據(jù)庫可有效提高開發(fā)效率,增強代碼的可讀性。以網(wǎng)絡課程中主要交互模塊的實現(xiàn)為例給出了實體框架技術(shù)的應用實例。
關鍵詞:實體框架;網(wǎng)絡課程;ASP.NET
中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2017)35-0095-03
Entity Framework Technology and its Application in Development of Network Course
LIU Wen-sheng1, LIU Bo-fu2 ,ZHU Ning1
(1.College of Educational Science, Hunan Normal University, Changsha 410081, China;2.Central South University, Changsha 410083, China)
Abstract: This paper introduces the principle and advantage of entity Framework technologies, The entity Framework technologies can improve the efficiency and enhance the readability of the code during database operating. Based on the examples of main interaction modules programming in network course this paper gives the examples of entity framework technologies application.
Key words: entity framework; network course;ASP.NET
1 概述
在現(xiàn)代遠程教育中,教學活動圍繞網(wǎng)絡課程展開,網(wǎng)絡課程是實施現(xiàn)代遠程教育目標的基本單元和核心內(nèi)容,所以,網(wǎng)絡課程的發(fā)展狀況對網(wǎng)絡教學的最終效果有著重要影響。為促進基于Internet的遠程教育的發(fā)展,實現(xiàn)教育資源的及時共享,作為網(wǎng)絡教育資源建設中的重要組成部分,網(wǎng)絡課程的設計與開發(fā)已成為現(xiàn)代教育技術(shù)工作的重要內(nèi)容。而網(wǎng)絡課程的開發(fā)離不開網(wǎng)絡技術(shù)的支持,現(xiàn)有的網(wǎng)絡課程的編程技術(shù),都在不同程度上存在著代碼重復率高、復用程度低、源代碼安全性差等缺陷。為適應信息技術(shù)的發(fā)展,加快網(wǎng)絡課程建設的步伐,將新的動態(tài)網(wǎng)站開發(fā)技術(shù)運用到網(wǎng)絡課程的建設工程中成了發(fā)展網(wǎng)絡教育的一個重要的課題。
ASP.NET是動態(tài)網(wǎng)站開發(fā)技術(shù)之一,為易用性為網(wǎng)絡課程的開發(fā)提供了強有力的支持。在以往的ASP.NET開發(fā)中,開發(fā)人員所使用的是ADO.NET數(shù)據(jù)訪問技術(shù),主要通過Command對象和DataSet對象等實現(xiàn)數(shù)據(jù)的增、刪、查、改等操作,如果數(shù)據(jù)結(jié)構(gòu)或者存儲過程發(fā)生改變,很有可能會破壞整個應用程序。而實體框架(Entity Framework)則不然,它是以ADO.NET為基礎開發(fā)出的對象關系映射(Object Relational Mapping,簡稱ORM)解決方案,它的作用是在關系型數(shù)據(jù)庫與業(yè)務實體對象之間做一個映射,這樣一來,在具體操作業(yè)務對象的時候只需操作對象的屬性和方法,無需編寫復雜的SQL語句。ADO.NET實體框架的出現(xiàn)使程序員以完全面向?qū)ο蟮乃枷腴_發(fā)應用程序,不但使程序員的工作量大大減少,也為應用程序日后的維護工作帶來了便利。近幾年來,實體框架技術(shù)因其開發(fā)周期短、可維護性高等優(yōu)點在動態(tài)網(wǎng)站開發(fā)中的地位日益上升,逐漸成為數(shù)據(jù)存取的主角。
2 實體框架概述
實體框架是一個對象關系映射工具,可以把開發(fā)人員在編程時使用的對象映射到底層的數(shù)據(jù)庫結(jié)構(gòu),自動從數(shù)據(jù)庫生成數(shù)據(jù)訪問層,能夠使程序員免于編寫冗長的數(shù)據(jù)訪問類,是一套能夠支持開發(fā)面向數(shù)據(jù)的應用程序的技術(shù)。因為實體框架是.NET Framework的一個組件,所以只要是安裝了.NET Framework 3.5 SP1以上版本的計算機均可運行此框架。
2.1 實體框架工作原理
實體框架是根據(jù)實體對象操作數(shù)據(jù)表中數(shù)據(jù)的一種面向?qū)ο蟮牟僮骺蚣?。它將?shù)據(jù)庫中的表映射成對應的類,數(shù)據(jù)表中的各個字段映射為對應類的屬性(property),表間關系映射為結(jié)合屬性(association),從而將數(shù)據(jù)庫的E-R模型轉(zhuǎn)化為編程語言的對象模型。從而使開發(fā)人員可以通過操作類來操作數(shù)據(jù)庫,而不需要考慮底層數(shù)據(jù)庫中的數(shù)據(jù)表和字段。ADO.NET實體框架支持三種數(shù)據(jù)創(chuàng)建模式,即: 代碼優(yōu)先(Code First)模式、模型優(yōu)先(Model First)模式、數(shù)據(jù)庫優(yōu)先(Database First)模式。
ADO.NET實體框架的核心是實體數(shù)據(jù)模型(Entity Data Model,簡稱EDM),由概念模型(Conception Model)、存儲模型(Storage Model)、概念-存儲模型映射(Conceptual-Storage Mapping)三部分組成。概念模型主要體現(xiàn)為一組能夠被應用程序直接使用的被稱為“實體(entity)”的類。存儲模型主要體現(xiàn)為一組與底層數(shù)據(jù)存儲介質(zhì)直接對應的類。概念-存儲模型映射主要用來解決“概念模型”中的類如何與“存儲模型”中的類相互對應的問題。實體框架使用這三種基于XML的語言表示的模型和映射文件把對象模型中的實體和關系的創(chuàng)建、讀取、刪除和更新等操作轉(zhuǎn)換為數(shù)據(jù)源中的等效操作。
2.2 ADO.NET實體框架的優(yōu)勢
實體框架是微軟推出的以ADO.NET為基礎的數(shù)據(jù)建模和對象持久化的最新框架。目的是減少面向數(shù)據(jù)的應用程序所需編寫的代碼量,減少開發(fā)時間,減輕日后的網(wǎng)站維護工作。
采用ADO.NET實體框架開發(fā)應用程序擁有如下優(yōu)勢:
1) 開發(fā)過程中可以通過概念模型直接對數(shù)據(jù)庫進行相關的操作,而不再對特定的數(shù)據(jù)引擎或者存儲架構(gòu)具有硬編碼依賴性;
2) 從Oracle和SQL Server等數(shù)據(jù)庫映射成的C#代碼具有相似性,開發(fā)中可以把注意力放到概念模型上,無需關心底層數(shù)據(jù)庫的細節(jié);
3) 概念模型和映射關系的改變對數(shù)據(jù)訪問層的影響不大;
4) 多個概念模型可映射到同一個存儲架構(gòu);
5) LINQ(即語言集成查詢)支持針對概念性模型的編譯時語法驗證。
3 實體框架開發(fā)環(huán)境架設
3.1 Visual Studio 2015中實體框架的安裝
若要在應用程序中使用實體框架技術(shù),首先需要安裝實體框架程序包。在菜單欄中“網(wǎng)站”的下拉菜單里選擇“管理NuGet程序包(N)…”,安裝Entity Framework,點擊“安裝”,即可將實體框架下載并安裝到解決方案中。
3.2 ADO.NET實體數(shù)據(jù)模型的創(chuàng)建
1) 在菜單欄中“網(wǎng)站”的下拉菜單中選擇“添加新項”,之后選擇“ADO.NET實體數(shù)據(jù)模型”,點擊添加,根據(jù)實體數(shù)據(jù)模型向?qū)?chuàng)建實體數(shù)據(jù)模型。
2) 在接下來有兩種模型選擇內(nèi)容:一種是“從數(shù)據(jù)庫生成”,即從已設計好的數(shù)據(jù)庫直接生成實體數(shù)據(jù)模型;另一種是“空模型”,即由開發(fā)人員重新設計實體數(shù)據(jù)模型,之后以手動方式由實體框架根據(jù)實體數(shù)據(jù)模型中的實體對象及對象關系等生成相應的數(shù)據(jù)庫。因為原網(wǎng)絡課程已有一個完整的數(shù)據(jù)庫,所以此處選擇“從數(shù)據(jù)庫生成”。
3) 點擊下一步,進入連接數(shù)據(jù)庫的向?qū)?,在“新建連接”中連接到自己的SQL Server服務器,然后選擇已有數(shù)據(jù)庫,同時會生成實體連接字符串。
4) 點擊下一步,選擇需要在模型中包含的數(shù)據(jù)庫對象,這里選擇“表”,其他保持默認。
5) 點擊完成,在App_Code文件夾中生成一個后綴名為.edmx的文件。Visual Studio 2015集成開發(fā)環(huán)境提供了一個可視化的實體數(shù)據(jù)模型編輯工具,即ADO.NET Entity Data Model Designer(或稱Entity Designer),在Entity Designer中能夠可視化的創(chuàng)建并編輯實體、實體之間的關系、數(shù)據(jù)庫和實體類的對應關系及集成關系等。Entity Designer還提供了對象關系模型的效驗功能。
Web.config文件保存了所創(chuàng)建的實體數(shù)據(jù)模型對應的數(shù)據(jù)庫連接。
通過創(chuàng)建實體數(shù)據(jù)模型可自動生成相關代碼,使程序員在與數(shù)據(jù)打交道時無需再關注底層數(shù)據(jù)的存儲結(jié)構(gòu),而將注意力轉(zhuǎn)向數(shù)據(jù)表對應的實體類。
4 應用實體框架技術(shù)實現(xiàn)網(wǎng)絡課程交互模塊
在Web應用程序中,不同訪問者的使用權(quán)限有所不同。在本網(wǎng)絡課程中,非學員用戶可以瀏覽網(wǎng)站中的信息公告,學習網(wǎng)站內(nèi)提供的學習教程以及下載網(wǎng)站中提供的源代碼實例等,但是沒有進行模擬測試的權(quán)限。所以,如果用戶想要進行模擬測試的話,必須先注冊成為該網(wǎng)站的學員,之后登錄到網(wǎng)站中方可進行模擬測試。
1) 用戶注冊
新學員注冊時,需要填寫用戶名、設置密碼并填寫郵箱地址等信息。另外,學員信息表(userName)中用戶名必須唯一,所以系統(tǒng)首先會對該用戶名進行驗證,如果用戶名已存在,則提醒用戶該名稱已被注冊,代碼如下:
//驗證用戶填寫的信息是否符合要求
var allrecords = mydb.userName.Where(c => c.userName1 ==username );
if (allrecords.Count() >= 1)
{ Label_name.Text = "該學員名已被注冊!";}
信息填寫無誤后,將新的紀錄添加到學員信息表(userName)中,代碼如下:
//添加記錄
userName myrecord = new userName() {userName1 =username,userPass =password ,textEmail =mail ,tate =DateTime.Now,inteGral =0,postNumber =0,privilege ="1" };
mydb.userName.Add(myrecord );
mydb.SaveChanges();
//顯示提示信息框,并跳轉(zhuǎn)到Login.aspx頁面
Response.Write("");
//清空文本框中的信息
TextBox_name.Text = TextBox_password.Text =TextBox_password2.Text = TextBox_mail.Text = TextBox_check.Text = "";
2) 用戶登錄
如果是學員身份登錄,則該網(wǎng)站的訪問量不變;如果是非學員身份(即guest)登錄,則網(wǎng)站訪問量增加1,登錄信息表(infoTable)中的數(shù)據(jù)隨之更新,主要代碼如下:
Application["guestsum"] = long.Parse(Application["guestsum"].ToString()) + 1;
Session["stuno"] = long.Parse(Application["guestsum"].ToString());
Session["stuname"] = "guest";
//將最新的guest號寫入infoTable
var itemrecord = mydb.infotable.Where(c => c.itemname == "guestlogin");
if (itemrecord.Count() > 0)
{ var firstrecord = itemrecord.First();
firstrecord.itemvalue = Session["stuno"].ToString ();}
mydb.SaveChanges();
4.1 實體框架技術(shù)在模擬測試模塊中的應用
網(wǎng)絡課程模擬測試模塊通常有這些題型,即判斷題、單選題、填空題、簡單題等,此處以單選題為例來詳細說明運用實體框架技術(shù)來進行數(shù)據(jù)存取的具體使用方法。
1) 試題索引頁
試題索引頁主要使用GridView控件顯示數(shù)據(jù)試卷編號,選擇“新建數(shù)據(jù)源”后,在配置數(shù)據(jù)源時選擇“Entity”綁定數(shù)據(jù)表。
數(shù)據(jù)源配置代碼如下:
在頁面的Page_Load()即裝載事件中添加代碼,將單選試題加載到頁面中,以第一道題為例,代碼如下:
protected void Page_Load(object sender, EventArgs e)
{jygc_courseEntities mydb = new jygc_courseEntities();//得到數(shù)據(jù)庫實體對象
string id = Request.QueryString["id"];//頁面間傳值,傳遞的是試卷編號
if (id == null)
{id = "1";}
if (!IsPostBack)
{//初始化相關數(shù)據(jù)
this.Label1.Text = this.Label1.Text + id.ToString();//試卷編號
//單選題試題
//單選題1
var danxuan_1 = mydb.shiTiTable.Where(c=>(c.shiJuanHao ==id)&&(c.tiXing =="單選題")&&(c.tiHao =="1"));//查詢試卷編號為傳遞的試卷編號且試題號為1的單選題的記錄
var dx_1 = danxuan_1.First();
this.dx_1.Text = dx_1.tiWen;
this.dxt_1_a.Text = "?;A、" + dx_1.xuanXiangA;
this.dxt_1_b.Text = "?;B、" + dx_1.xuanXiangB;
this.dxt_1_c.Text = "?;C、" + dx_1.xuanXiangC;
this.dxt_1_d.Text = "?;D、" + dx_1.xuanXiangD;
}}
2) 保存學員答題結(jié)果和成績
學員做完題目之后單擊提交按鈕,根據(jù)當前用戶當前的登錄信息,判斷數(shù)據(jù)的存取行為。
如果該學員還未登錄,則需要登錄后才可進行試題模擬,之后再進行進一步的判斷,在單選題提交按鈕的單擊事件中添加代碼如下:
//如果已經(jīng)做過此試卷,則刪除原有記錄
//刪除答案表中原有記錄
var danxuandaan = mydb.stuDaTiTable.Where(c => (c.stuno == stuno) && (c.stuname == stuname) && (c.shiJuanHao == id) && (c.tiXing == "單選題"));
if (danxuandaan.Count() > 0)
{foreach (var d in danxuandaan)
{ mydb.stuDaTiTable.Remove(d); }//移除答案表中原有的記錄
mydb.SaveChanges(); }//保存數(shù)據(jù)庫
//刪除成績表中原有的成績
var danxuanchengji = mydb.stuChengJiTable.Where(c => (c.stuno == stuno) && (c.stuname == stuname) && (c.shiJuanHao == id) && (c.tiXing == "單選題"));
if (danxuanchengji.Count() > 0)
{foreach (var c in danxuanchengji)
{ mydb.stuChengJiTable.Remove(c); }//移除成績表中原有成績記錄
mydb.SaveChanges();}
將該學員新的答題結(jié)果保存至學員答題表(stuDaTiTable)中,代碼如下:
//獲取每道單選題的答案
//單選題1
if (this.dxt_1_a.Checked == true)
{dx_01 = "A";}
if (this.dxt_1_b.Checked == true)
{dx_01 = "B";}
//保存單選題答案至答案表
//單選題1
stuDaTiTable danxuandaan_1 = new stuDaTiTable() { stuno = stuno, stuname = stuname, shiJuanHao = id, tiXing = "單選題", tiHao = "1", stuDaAn = dx_01 };
mydb.stuDaTiTable.Add(danxuandaan_1); //添加一條新紀錄
mydb.SaveChanges();
根據(jù)學員的答題結(jié)果計算所得分數(shù),并將新的分數(shù)添加到學員成績數(shù)據(jù)表中,代碼如下:
//獲取單選題的分數(shù)
int dx_sum = 0;//總分數(shù)
//單選題1
var danxuanfenshu_1 = mydb.shiTiTable.Where(c => (c.shiJuanHao == id) && (c.tiXing == "單選題") && (c.tiHao == "1"));
var dxt_1 = danxuanfenshu_1.First();
if (dx_01 == dxt_1.daAn)
{dx_sum = dx_sum + Convert.ToInt32(dxt_1.fenZhi); }
//保存單選題成績至成績表
stuChengJiTable danxuanchengji_new1 = new stuChengJiTable() { stuno = stuno, stuname = stuname, shiJuanHao = id, tiXing = "單選題", testTime = null, chengJi = dx_sum.ToString() };
mydb.stuChengJiTable.Add(danxuanchengji_new1);
mydb.SaveChanges();
this.Image_dx.Visible = true;
this.Label_dxt_fs.Visible = false;
學員完成模擬測試后,點擊“完成測試并查看答案”的按鈕后,頁面顯示該學員每道題的正誤,如果錯誤,顯示正確答案。
查看測試成績的代碼如下:
//單選題成績
var dxt_chengji = mydb.stuChengJiTable.Where(c => (c.stuno == stuno) && (c.stuname == stuname) && (c.shiJuanHao == id) && (c.tiXing == "單選題")); (下轉(zhuǎn)第125頁)
(上接第97頁)
if (dxt_chengji.Count() > 0)
{var dxt_1 = danxuant_1.First();
var dxt_fenshu = dxt_chengji.First();
this.Label_dxt_fs.Visible = true;
this.Label_dxt_fs.Text = "單選題分數(shù):" + dxt_fenshu.chengJi;
if (dxt_1.stuDaAn == dx_1.daAn)
{ this.Image_dxt_01.ImageUrl = "~/images/right.jpg";}
else
{ this.Image_dxt_01.ImageUrl = "~/images/wrong.jpg";
this.Label_dxt_daan01.Visible = true;
this.Label_dxt_daan01.Text = "正確答案:" + dx_1.daAn; } }
else
{ this.Label_dxt_fs.Visible = true;
this.Label_dxt_fs.Text = "還未測試!";}}
參考文獻:
[1] 李知杰,趙健飛.基于EF的數(shù)據(jù)建模方法[J].軟件導刊,2015,14(8):55-56.
[2] 楊小彥.基于ASP.NET MVC和實體框架的科技項目管理系統(tǒng)的設計與實現(xiàn)[D].蘭州:蘭州交通大學,2015.
[3] 鄧軍.基于EF的N層架構(gòu)的藝術(shù)學院門戶系統(tǒng)的設計與實現(xiàn)[D]. 廈門:廈門大學,2014.