EF技术在进销存管理系统的应用

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.

作者:林佳一 单位:广东交通职业技术学院信息学院