电子技术论文基于.NET Entity Framework数据库访问机制的设计

所属栏目:电子技术论文 发布日期:2014-12-22 14:33 热度:

  企业在开发软件的过程中,为提升开发效率和增加技术积累,对不同的项目需求提取出一些共同的框架,数据库访问层便是其中之一。目前有很多好地 ORM[1?2](对象关系映射机制)框架已经很好地实现了数据访问层,而且得到了很广泛的应用,但由于许多公司技术人员水平有限,提取的数据库访问层和业务逻辑层的耦合程度不高,对开发效率上的提升不够明显[3]。

  摘 要: Entity Framework技术因其灵活、开发周期短等优点,被广泛运用到.NET平台开发中。基于Entity Framework框架设计一个典型MVC架构中的数据库访问层,运用Entity Framework框架中的Code First方式结合泛型、封装、单例模式等技术,实现实体类映射到数据库表并自动往数据库建表的功能,并对每个实体类自动向外发布了增、删、改、查4种操作方法,编译成DLL库文件以插件的形式供业务逻辑层调用,达到与业务逻辑和数据库完全解耦。

  关键词:电子技术论文, 实体框架,泛型类型,接口,数据库

  Research and application of database access mechanism based on .Net Entity Framework

  SHEN Xia?fei, WANG Jian?zhong

  (Institute of Information and Control, Hangzhou Dianzi University, Hangzhou 310018, China)

  Abstract: Entity Framework technology is widely used in .NET platform development due to its flexibility, short development cycle and other advantages. A database access layer in typical MVC architecture was designed based on Entity Framework. The Code First mode in Entity Framework combined with a generic framework, packaging, single?case model and other technologies is used to realize the entity classes mapping to database tables and generate the database tables automatically. The operations of addition, deletion, update and selection are released to each entity class automatically. The DLL library files are compiled for the business logic layer call in the form of plug?in to achieve the complete decoupling of business logic and database.

  Keywords: Entity Framework; generic type; interface; database

  0 引 言

  本文设计的数据库访问层解决了以上问题,它与业务逻辑低耦合,使用简单,以高度封装的DLL形式调用,可以节省大量的对数据库存取的繁琐操作,程序员能从数据库存取中解脱出来专注于业务逻辑的设计。

  1 相关技术

  1.1 Entity Framework

  实体框架,是一种对象关系映射机制(ORM),能够减少.NET Framework开发人员面向对象编程环境与关系数据库环境之间的不匹配情形[4],使开发人员基本上可以通过熟悉的面向对象的技术来与应用程序的概念模型进行交互[5]。在实体框架中,开发人员能够以特定于域的对象和属性(如客户和客户地址)形式使用数据,而不必考虑存储此数据的基础数据库表和列。开发人员可以对概念模型发出数据访问操作,然后实体框架会将该操作转换为关系数据库操作。

  1.2 Code First

  Code First是基于Entity Framework的新的开发模式,原来只有Database First和Model First两种[6]。Code First顾名思义,就是先用C#/VB.NET的类定义好领域模型(实体类),然后用这些类映射到现有的数据库表或者自动产生新的数据库表。Code First同样支持通过Data Annotations或fluent API进行定制化配置[7]。其中Entity Framework库里面的DbContext基类为操控实体对象执行上下文环境,提供所需的架构和映射元数据(Meatadata)、数据库链接,同时还包括对象缓存、跟踪状态和关联管理等功能[8]。使用时,定义一个继承于DbContext的类,在该类里面配置好需要映射到数据库表的各实体类。配置好后,这个类就成为了业务逻辑层里实体类和数据库表交互的中间模型。   2 数据库访问机制设计

  2.1 总体设计框架

  数据库访问层是搭建在.NET Entity Framework框架的Code First方式之上的,将映射到数据库表的各实体类通过DbContext类的扩展类配置好后,这个扩展类负责这些实体类与数据库表的交互,这些实体类便共用了这个执行上下文环境。当不需要定制复杂的映射关系(大部分情况下)时,可以直接以dll的形式使用本模块,这么做实际上是每个实体类通过一个 DbContext类的扩展类映射到数据库,即每个实体类独立一个执行上下文环境,将实体类泛型化,每个实体类通过泛型类型传入数据访问层,该层会通过层层调用自动生成对应的DbContext类的扩展类(执行上下文)。当需要进行定制化配置时,可以重写 DataContextService,DataContextProvider,DataContext三个抽象类,手动进行实体类的配置,并在配置文件里配置好关系。可见本模块的可扩展性比较好。

  如图1所示,该数据库访问模块逻辑上又分三层:基础服务层、仓储层、数据访问层。基础服务层,该层通过读取配置文件信息获得对应仓储的程序集名和类型名,然后通过“反射”获取该仓储类型的对象。仓储层,提供对应不同数据库(SQL Server、Oracle等)的数据库访问层。数据库访问层,直接与数据库相连并对外提供增、删、改、查等底层方法以供顶层调用,这里采用了微软的 Code First框架来实现对数据库的直接访问,也就是数据访问层。其中,基础服务层和仓储层都继承了同一个接口IDataContextProvider,该接口在仓储层得以实现,从而实现了业务逻辑层、数据库访问层、数据库三者之间的解耦。

  2.2 基础服务层

  基础服务层提供数据库访问层对外接口的定义和对内数据访问的管理,是业务逻辑层和数据库访问在逻辑上的中间连接层。

  如图2所示,DataContextService为基础服务层的核心抽象类,业务逻辑层(如:DomainObjectContext Service类)实现该类型,以访问该业务逻辑模块所提供的数据相关的操作。各个业务层模块针对自身模块的数据访问服务,必须继承于该类。并重写配置文件ConfigurationGuid,就可以实现通过配置文件探查到数据访问层。本类为业务层和数据访问层解耦提供基础服务。该类实现了 IDataContextService接口,IDataContextService接口中定义了一个GetRepository()方法返回了一个 Repository泛型对象,该对象封装了对数据库的增、删、改、查方法,并继承了IQueryable即支持linq查询。

  DataContextService里面ConfigureSectionName是配置文件配置节的名称。当实现 DataContextService的扩展类探查到数据库访问层后,将返回的仓储对象与自己索引起来存入Dictionary(索引容器)里面,下次探查对应仓储对象时就不需要再通过反射获取对象,这样可以提高代码运行效率,本文的设计中多次用到这种方式来提升模块性能。返回的仓储对象才真正实现GetRepository()方法。

  2.3 仓储层

  仓储层为基础服务层提供对应服务,Code first是以Dbcontext模型为容器把实体对象和数据库建立起链接的,不同的实体对象可能属于不同的容器,仓储层就实现了具体的实体对象和对应的Dbcontext模型索引。

  如图3所示,DataContextProvider为仓储层的核心抽象类,实际的仓储类(如DomainObjectContext Provider类)继承该类型并实现CreateDbContextCore()虚方法,以提供该仓储类对应数据库访问层即对应的DbContext的扩展类。DbContext的扩展类是读数据库访问方法的最终提供者,EFRepository 类通过传入不同的DbContext扩展类实现了IRepository接口。

  图3 仓储层结构

  2.4 数据访问层

  数据访问层实现了一套对不同的实体对象自动生成对应Dbcontext模型的机制,这样外部业务逻辑层使用本模块,通过泛型参数传入实体类型,该机制就会对其自动生成属于这个实体的Dbcontext模型。

  如图4所示,该层基于EF的Code first方式配置模型实现对数据库的访问,DbContext继承DbContext,重写了数据库链接字符串,并修改了EF库对多个DbContext扩展类访问同一数据库冲突的漏洞,且实现了数据迁移特性即当实体类里有字段变化时,这种变化能自动移植到对应的数据表列。然后用户可以继承DbContext类根据自身的需求配置不同的实体对象执行上下文环境,并向上提供给对应仓储类。目前DbContext已支持Sqlserver之外的数据库如Oracle,所以通过配置甚至可以实现对Oracle数据库的访问支持。

  3 应用研究

  本文实现的数据库访问模块主要目的在于实际应用,为了更直接地展示其使用的快捷、简单,下面通过实际例子加以说明。

  图4 数据访问层

  先定义一个实体类Person,继承于DomainObject。这里DomainObject类只有一个Guid类型的字段。本模块设计时对实体类做出了限制:任何实体类只有继承于DomainObject类才能被映射到数据库。

  public class Person:DomainObject {

  public string Name { get; set; }

  public int Age { get; set; }   }

  打开VS开发环境,建立一个控制台应用,添加以下代码:

  DomainObjectDataContextService.UsingDataContext( );

  Person me = new Person( ) { Name="张三",Age=24};

  using (var persons = DomainObjectDataContextService.Instance.GetRepository( )){

  persons.Add(me);

  persons.Save( );

  }

  如图5所示,在这段代码执行之前在数据库里没有任何数据库以及表。运行之后,在数据库里可以看到如图6结果,增加了YUNGO_SYS_DB2数据库和People数据表以及一条新的记录。

  <\192.168.6.11现代电子技术14年37卷第24期Image17T5.tif>

  图5 执行前数据库

  删除记录操作代码示例:

  using (var persons = DomainObjectDataContextService.Instance.GetRepository()){

  var p = from person in persons

  where person.Name == "张三"

  select person;

  persons.Remove(p.First());

  persons.Save();

  }

  查询数据库操作代码示例

  using (var persons = DomainObjectDataContextService.Instance.GetRepository()){

  var p = from person in persons

  where person.Name == "张三"

  select person;

  string name = p.First().Name;

  int age = p.First().Age;

  }

  改记录操作代码示例

  using (var persons = DomainObjectDataContextService.Instance.GetRepository()){

  var p = from person in persons

  where person.Name == "张三"

  select person;

  p.First().Age=20;

  persons.Save(); }

  总的来说,通过实体框架的对象层,可以执行以下任务:针对概念模型运行查询;跟踪针对对象做所需的更改;将对象更改传播回数据源;将对象绑定到控件。

  图6 执行后数据库

  4 结 语

  本文详细分析了数据库访问机制的各部分结构,并介绍了应用方法。该机制缺点是不支持存储过程,优点是在进行数据库操作时不需要建表,大量需要手动书写代码配置的映射关系通过泛型可以自动生成;高度封装对外公开有限接口,所以使用时操作简单;代码结构清晰,各部分模块化程度高,继承体系完美,所以扩展性强,对于需定制的映射关系,修改方便。

  参考文献

  [1] 袁立国,陈中育,李方鹏,等.一种软件开发框架的设计优化[J].计算机系统应用,2013,22(5):70?74.

  [2] 卢小垂.基于.NET平台的ORM轻量级开发框架的设计与实现[J].电信快报,2012(10):10?16.

  [3] 赵亮.使用Entity Framework 快速开发ASQ.NET网站[J].企业导报,2012(18):269?270.

  [4] 黄睿.基于Java技术的ORM工具接口的设计与实现[D].长春:吉林大学,2012.

  [5] LERMAN Julia, MILLER Rowan. Programming entity framework: DbContext [M]. America: O'Reilly Media, 2012.

  [6] 谢日星.Entity Framework技术在分层架构中应用研究[J].电脑知识与技术,2011(15):3326?3327.

  [7] LERMAN Julia, MILLER Rowan. Programming Entity Framework: code first [M]. America: O'Reilly Media, 2012.

文章标题:电子技术论文基于.NET Entity Framework数据库访问机制的设计

转载请注明来自:http://www.sofabiao.com/fblw/dianxin/dianzijishu/24457.html

相关问题解答

SCI服务

搜论文知识网的海量职称论文范文仅供广大读者免费阅读使用! 冀ICP备15021333号-3