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