陈 姣,李湘宜,钟远宁
(卡斯柯信号有限公司,北京 100160)
国内高铁采用CTCS-2、CTCS-3级列控系统,列控数据是列控系统中各个子系统及其设备的数据源,包括信号数据、线路坡度、线路速度、应答器信息、车站进路数据表等,这些基础数据的正确性与否,直接关系到行车的安全性。随着国内高铁线路的不断延伸,各列控系统对列控数据管理的要求进一步提高。
Entity Framework技术是新一代微软.NET平台中数据存取技术,是一种对象/关系映射(Object/Relational Map-ping,ORM)技术,实现了采用关系模型来组织数据与实体业务对象间的一一映射,解决数据持久化问题,不但可以提高开发效率,还可以进一步提高列控数据管理的有效性。
列控工程数据主要包括正线信号数据表、线路速度/坡度表、桥梁隧道信息表、分相数据表、线路里程断链明细表、车站信息表、应答器位置表、进路信息表、RBC信息表、线路坡度表、道岔信息表、大号码道岔数据包发送条件检查范围表、里程系信息表、异物侵限表、车站表、站内轨道区段信息表和接触网分相数据表。
一般而言,开发人员利用传统技术进行系统开发时,需要和数据库进行数据交换,在.NET平台中,数据存储交换技术通常有ODBC、DAO、ADO、ADO.NET等几种数据层访问技术,其中,开发者最常用的是手写SQL语句,然后通过ADO.NET连接类与数据库进行交互,这是较为常见的数据库开发技术。虽然这种技术接近底层,可以直接操作数据库,但也存在SQL操作失误风险,并且当业务发生细小改变时也需要对数据库访问的SQL语言进行大量的修改,因此传统方法需要耗费大量的时间和精力。
针对这种现状,Entity Framework技术能够极大改善传统技术的缺点。
Entity Framework技术的核心是实体数据模型(Entity Data Model,EDM)。基于实体数据访问的模型如图1所示。
图1 Entity Framework访问模型Fig.1 Entity Framework access model
Entity Framework技术遵守对象/关系映射(ORM)的思想,抽象化数据结构,将每个数据库对象都抽象成为应用程序对象(entity),而数据的字段都转换为属性(property),关系转换为结合属性(association)。实体数据模型用于在实体框架基础上生成应用程序和数据的应用,包括概念模型、存储模型以及映射3大部分。概念模型主要负责访问对象与属性;存储模型主要描述数据库中的数据结构体,比如表、主键、列、索引等,与Provider一起,负责实际对数据库的访问;映射将上方的概念模型层和下方的储存模型层的数据结构对应。
传统方法与Entity Framework方法对比情况,如表1所示。
表1 传统方法与Entity Framework对比Tab.1 Comparison of traditional method with Entity Framework
Entity Framework提供3种数据建模方式。
1)Code-First模式
该模式可以先构建业务模型,然后通过映射XML文件,完成模型到数据库的映射,生成数据库表。与传统的先建表再编码的方式相比,更加符合以业务数据流为中心的设计思想,而不是以数据库为中心进行开发驱动。
2)Database-First模式
该模式是比较传统的数据建模方式,先完成数据库模型设计,再生成实体层的实体类,当系统中仅存在一个数据库时,这种方法就比较简单,只需做好原数据库与实体间的映射关系,EF可以自动生成数据模型,且包含一一对应的类及其属性变量。
3)Model-First模式
该模式是利用Visual Studio设计出业务模型及它们之间的映射关系,然后再根据这些模型和映射关系生成数据库表及代码文件。
列控系统中的关键设备及其仿真软件:无线闭塞中心、列控中心、计算机联锁、临时限速服务器等设备,均需按照列控数据表进行配置。通过Entity Framework技术,可以对列控数据表进行建模。
根据信号数据表,对于每个室外信号设备,如:应答器、信号机、轨道区段等实体建立模型,本文对每个设备均创建了一个类。
3.1.1 创建主键
为保证数据库中表的完整性,每个表中都须包含一个主键,需要在表中某列或多个列的组合上定义一个主键(PRIMARY KEY)进行约束。
Code-First 模式下,通过类的属性变量名称来定义主键:声明实体模型类时若将某属性变量命名为ID 或<类名>ID,则该属性将被定义为主键代码如图2所示。
图2 创建主键Fig.2 Creating a primary key
3.1.2 创建主外键关系
在Code-First模式下,通过在相关联的类中添加虚属性来实现主外键关系。例如,本文中的SignalEntity类 和StationEntity类 分 别 表示信号机和车站类别,两者间存在关联,可在SignalEntity类中添加StationEntity虚属性,从而完成两者的关系关联,同时在编译过程中,程序后台延迟加载数据,代码如图3所示。
图3 创建主外键关系Fig.3 Creating a relationship of the primary and foreign key
为将实体模型映射到数据库中,还需要创建数据上下文类:派生自System.Data.Entity.DbContext;本文创建了一个名称为LineDataModel的数据上下文类,并定义了实体集属性,代码如图4所示。
图4 创建数据上下文Fig.4 Creating a data context
使用Code-First开发模式时,将会在SQL Server Express实例中创建一个与DbContext名称相同的数据库,并且可以自动连接到这个数据库。
关系映射就是数据库字段和C#对象属性的中间桥梁,这种实体框架的核心工作就是通过这个映射生成操作数据库的SQL语句,并调用ADO.NET,至此,就完成了列控数据的EF建模。
基于Entity Framework建模的列控数据管理可以应用于仿真测试系统、数据测试系统、维护终端、计算机联锁、列控中心、无线闭塞中心的配置数据生成,按照结构体导出的方式生产嵌入式系统所需的数据文件。
同时,也可作为列控数据管理技术平台的数据核心处理,可以依据相关规范,进行数据验证工作。
基于Entity Framework方法的列控数据建模,更加注重业务层面,加强了系统开发逻辑性和可维护性,与先建立数据库再进行编码的传统方法相比,在业务改变时,不需要对数据库访问的SQL语言进行大量修改,有效提高了开发效率。