陳 姣,李湘宜,鐘遠(yuǎn)寧
(卡斯柯信號(hào)有限公司,北京 100160)
國(guó)內(nèi)高鐵采用CTCS-2、CTCS-3級(jí)列控系統(tǒng),列控?cái)?shù)據(jù)是列控系統(tǒng)中各個(gè)子系統(tǒng)及其設(shè)備的數(shù)據(jù)源,包括信號(hào)數(shù)據(jù)、線路坡度、線路速度、應(yīng)答器信息、車站進(jìn)路數(shù)據(jù)表等,這些基礎(chǔ)數(shù)據(jù)的正確性與否,直接關(guān)系到行車的安全性。隨著國(guó)內(nèi)高鐵線路的不斷延伸,各列控系統(tǒng)對(duì)列控?cái)?shù)據(jù)管理的要求進(jìn)一步提高。
Entity Framework技術(shù)是新一代微軟.NET平臺(tái)中數(shù)據(jù)存取技術(shù),是一種對(duì)象/關(guān)系映射(Object/Relational Map-ping,ORM)技術(shù),實(shí)現(xiàn)了采用關(guān)系模型來組織數(shù)據(jù)與實(shí)體業(yè)務(wù)對(duì)象間的一一映射,解決數(shù)據(jù)持久化問題,不但可以提高開發(fā)效率,還可以進(jìn)一步提高列控?cái)?shù)據(jù)管理的有效性。
列控工程數(shù)據(jù)主要包括正線信號(hào)數(shù)據(jù)表、線路速度/坡度表、橋梁隧道信息表、分相數(shù)據(jù)表、線路里程斷鏈明細(xì)表、車站信息表、應(yīng)答器位置表、進(jìn)路信息表、RBC信息表、線路坡度表、道岔信息表、大號(hào)碼道岔數(shù)據(jù)包發(fā)送條件檢查范圍表、里程系信息表、異物侵限表、車站表、站內(nèi)軌道區(qū)段信息表和接觸網(wǎng)分相數(shù)據(jù)表。
一般而言,開發(fā)人員利用傳統(tǒng)技術(shù)進(jìn)行系統(tǒng)開發(fā)時(shí),需要和數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交換,在.NET平臺(tái)中,數(shù)據(jù)存儲(chǔ)交換技術(shù)通常有ODBC、DAO、ADO、ADO.NET等幾種數(shù)據(jù)層訪問技術(shù),其中,開發(fā)者最常用的是手寫SQL語句,然后通過ADO.NET連接類與數(shù)據(jù)庫(kù)進(jìn)行交互,這是較為常見的數(shù)據(jù)庫(kù)開發(fā)技術(shù)。雖然這種技術(shù)接近底層,可以直接操作數(shù)據(jù)庫(kù),但也存在SQL操作失誤風(fēng)險(xiǎn),并且當(dāng)業(yè)務(wù)發(fā)生細(xì)小改變時(shí)也需要對(duì)數(shù)據(jù)庫(kù)訪問的SQL語言進(jìn)行大量的修改,因此傳統(tǒng)方法需要耗費(fèi)大量的時(shí)間和精力。
針對(duì)這種現(xiàn)狀,Entity Framework技術(shù)能夠極大改善傳統(tǒng)技術(shù)的缺點(diǎn)。
Entity Framework技術(shù)的核心是實(shí)體數(shù)據(jù)模型(Entity Data Model,EDM)?;趯?shí)體數(shù)據(jù)訪問的模型如圖1所示。
圖1 Entity Framework訪問模型Fig.1 Entity Framework access model
Entity Framework技術(shù)遵守對(duì)象/關(guān)系映射(ORM)的思想,抽象化數(shù)據(jù)結(jié)構(gòu),將每個(gè)數(shù)據(jù)庫(kù)對(duì)象都抽象成為應(yīng)用程序?qū)ο?entity),而數(shù)據(jù)的字段都轉(zhuǎn)換為屬性(property),關(guān)系轉(zhuǎn)換為結(jié)合屬性(association)。實(shí)體數(shù)據(jù)模型用于在實(shí)體框架基礎(chǔ)上生成應(yīng)用程序和數(shù)據(jù)的應(yīng)用,包括概念模型、存儲(chǔ)模型以及映射3大部分。概念模型主要負(fù)責(zé)訪問對(duì)象與屬性;存儲(chǔ)模型主要描述數(shù)據(jù)庫(kù)中的數(shù)據(jù)結(jié)構(gòu)體,比如表、主鍵、列、索引等,與Provider一起,負(fù)責(zé)實(shí)際對(duì)數(shù)據(jù)庫(kù)的訪問;映射將上方的概念模型層和下方的儲(chǔ)存模型層的數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)。
傳統(tǒng)方法與Entity Framework方法對(duì)比情況,如表1所示。
表1 傳統(tǒng)方法與Entity Framework對(duì)比Tab.1 Comparison of traditional method with Entity Framework
Entity Framework提供3種數(shù)據(jù)建模方式。
1)Code-First模式
該模式可以先構(gòu)建業(yè)務(wù)模型,然后通過映射XML文件,完成模型到數(shù)據(jù)庫(kù)的映射,生成數(shù)據(jù)庫(kù)表。與傳統(tǒng)的先建表再編碼的方式相比,更加符合以業(yè)務(wù)數(shù)據(jù)流為中心的設(shè)計(jì)思想,而不是以數(shù)據(jù)庫(kù)為中心進(jìn)行開發(fā)驅(qū)動(dòng)。
2)Database-First模式
該模式是比較傳統(tǒng)的數(shù)據(jù)建模方式,先完成數(shù)據(jù)庫(kù)模型設(shè)計(jì),再生成實(shí)體層的實(shí)體類,當(dāng)系統(tǒng)中僅存在一個(gè)數(shù)據(jù)庫(kù)時(shí),這種方法就比較簡(jiǎn)單,只需做好原數(shù)據(jù)庫(kù)與實(shí)體間的映射關(guān)系,EF可以自動(dòng)生成數(shù)據(jù)模型,且包含一一對(duì)應(yīng)的類及其屬性變量。
3)Model-First模式
該模式是利用Visual Studio設(shè)計(jì)出業(yè)務(wù)模型及它們之間的映射關(guān)系,然后再根據(jù)這些模型和映射關(guān)系生成數(shù)據(jù)庫(kù)表及代碼文件。
列控系統(tǒng)中的關(guān)鍵設(shè)備及其仿真軟件:無線閉塞中心、列控中心、計(jì)算機(jī)聯(lián)鎖、臨時(shí)限速服務(wù)器等設(shè)備,均需按照列控?cái)?shù)據(jù)表進(jìn)行配置。通過Entity Framework技術(shù),可以對(duì)列控?cái)?shù)據(jù)表進(jìn)行建模。
根據(jù)信號(hào)數(shù)據(jù)表,對(duì)于每個(gè)室外信號(hào)設(shè)備,如:應(yīng)答器、信號(hào)機(jī)、軌道區(qū)段等實(shí)體建立模型,本文對(duì)每個(gè)設(shè)備均創(chuàng)建了一個(gè)類。
3.1.1 創(chuàng)建主鍵
為保證數(shù)據(jù)庫(kù)中表的完整性,每個(gè)表中都須包含一個(gè)主鍵,需要在表中某列或多個(gè)列的組合上定義一個(gè)主鍵(PRIMARY KEY)進(jìn)行約束。
Code-First 模式下,通過類的屬性變量名稱來定義主鍵:聲明實(shí)體模型類時(shí)若將某屬性變量命名為ID 或<類名>ID,則該屬性將被定義為主鍵代碼如圖2所示。
圖2 創(chuàng)建主鍵Fig.2 Creating a primary key
3.1.2 創(chuàng)建主外鍵關(guān)系
在Code-First模式下,通過在相關(guān)聯(lián)的類中添加虛屬性來實(shí)現(xiàn)主外鍵關(guān)系。例如,本文中的SignalEntity類 和StationEntity類 分 別 表示信號(hào)機(jī)和車站類別,兩者間存在關(guān)聯(lián),可在SignalEntity類中添加StationEntity虛屬性,從而完成兩者的關(guān)系關(guān)聯(lián),同時(shí)在編譯過程中,程序后臺(tái)延遲加載數(shù)據(jù),代碼如圖3所示。
圖3 創(chuàng)建主外鍵關(guān)系Fig.3 Creating a relationship of the primary and foreign key
為將實(shí)體模型映射到數(shù)據(jù)庫(kù)中,還需要?jiǎng)?chuàng)建數(shù)據(jù)上下文類:派生自System.Data.Entity.DbContext;本文創(chuàng)建了一個(gè)名稱為L(zhǎng)ineDataModel的數(shù)據(jù)上下文類,并定義了實(shí)體集屬性,代碼如圖4所示。
圖4 創(chuàng)建數(shù)據(jù)上下文Fig.4 Creating a data context
使用Code-First開發(fā)模式時(shí),將會(huì)在SQL Server Express實(shí)例中創(chuàng)建一個(gè)與DbContext名稱相同的數(shù)據(jù)庫(kù),并且可以自動(dòng)連接到這個(gè)數(shù)據(jù)庫(kù)。
關(guān)系映射就是數(shù)據(jù)庫(kù)字段和C#對(duì)象屬性的中間橋梁,這種實(shí)體框架的核心工作就是通過這個(gè)映射生成操作數(shù)據(jù)庫(kù)的SQL語句,并調(diào)用ADO.NET,至此,就完成了列控?cái)?shù)據(jù)的EF建模。
基于Entity Framework建模的列控?cái)?shù)據(jù)管理可以應(yīng)用于仿真測(cè)試系統(tǒng)、數(shù)據(jù)測(cè)試系統(tǒng)、維護(hù)終端、計(jì)算機(jī)聯(lián)鎖、列控中心、無線閉塞中心的配置數(shù)據(jù)生成,按照結(jié)構(gòu)體導(dǎo)出的方式生產(chǎn)嵌入式系統(tǒng)所需的數(shù)據(jù)文件。
同時(shí),也可作為列控?cái)?shù)據(jù)管理技術(shù)平臺(tái)的數(shù)據(jù)核心處理,可以依據(jù)相關(guān)規(guī)范,進(jìn)行數(shù)據(jù)驗(yàn)證工作。
基于Entity Framework方法的列控?cái)?shù)據(jù)建模,更加注重業(yè)務(wù)層面,加強(qiáng)了系統(tǒng)開發(fā)邏輯性和可維護(hù)性,與先建立數(shù)據(jù)庫(kù)再進(jìn)行編碼的傳統(tǒng)方法相比,在業(yè)務(wù)改變時(shí),不需要對(duì)數(shù)據(jù)庫(kù)訪問的SQL語言進(jìn)行大量修改,有效提高了開發(fā)效率。