【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)

时间:2021-08-28 09:08:11

项目伊始,创建数据库交互层代码是底层框架的首要任务。常用的做法包括手动编码、Hibernate或者动软之类的代码生成器,而多数人忽略了.Net环境下VS提供的两套非常好用的数据层工具。

EF和Linq2Sql两套框架。 实际上他们相比其他方式绝对是最快,最方便的。 对使用者而言,无论EF还是Linq2Sql,他们都默认将项目配置了正确的数据库连接,大幅减少在代码中的工作量。

 

EF是Entity Framework 的缩写,目前应该是到了第7个版本(貌似在Beta版本)。

Microsoft has given the following definition of Entity Framework:

The Microsoft ADO.NET Entity Framework is an Object/Relational Mapping (ORM) framework that enables developers to work with relational data as domain-specific objects, eliminating the need for most of the data access plumbing code that developers usually need to write.

实际上,按照微软给出的定义,EF的目的在于简化开发人员工作量,推出了这套框架。下图是EF的工作流程示例。

 

【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)

 

实际上,EF支持从数据表建立实体类,从实体类生成数据表以及从数据库设计(DB Model)自动创建实体类和数据表。

如此可以直接大幅降低花费在数据库设计、建表和写实体类的工作。毕竟那是码农们干的事情,程序员怎么可以这么浪费时间呢。

 

目前为止,EF6应该是最新的。接下来从 table -> Domain Class的模式出发,简单介绍EF的使用。

VS里自己集成了EF,创建EF的数据层的步骤是:为解决方案添加数据库连接,之后在解决方案下新建项目作为数据交互层,再在该项目下新建EF。

 

 

 【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)

 

1. 建立数据库连接。

 

【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)

 

 2. 创建ADO.Net 数据库实体

【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)

3. 选择Code First, 这里我是已经存在数据库了。

【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)

 

 4. 可以看到结果已经创建好所有被选中的数据表实体模型了。

 

接下来我们写一段代码进行数据访问。在我的示例里,我们计划查询的一张表目前的数据量是在100万条记录以上。我们进行简单的select查询。

public void Test1_Select()
{
Model1 modelContext
= new Model1();
//select from rt_LeakProbe
  var temp = modelContext.rt_LeakProbe.toList();
long count = temp.Count();
  DateTime lastDate
= temp.GroupBy(x => x.UploadTime).Max(x => x.Key);  Console.WriteLine("count is: {0}; last Data Time is :{1};", count, lastDate.ToString("yyyy-MM-dd HH:mm:ss:ffff"));
}

在我们使用 db First创建了数据表的实体同时,得到了一个默认命名为 Model1的类。这个类实际上是我们操作所有数据表的核心。在前一张截图中可以看到,Model1 是继承了DbContext类。

关于DbContext类,可以理解成一个具备访问配置项目的基类,在这里,我们要访问的项目就是在这个项目的App.Config中能够找到的配置项。(你也可以认为就是数据库连接)

 

以上代码使用MS Test框架创建单元测试形式来测试。

需要注意的是,MS Test同样需要使用NuGet进行EF的安装以便正常读取到数据库连接配置。

【Visual Studio】 使用EF、 Linq2Sql快速创建数据交互层(一)

查询结果, 数据量 1067189, 最新纪录上传时间是11:54:25.777。

 

相信EF的优势已经有所体现。当然个人暂时认为是存在一定不足的,比如说业务表设计中是可以使用继承方式简化一部分操作,而无论EF、Hibernate还是 Linq2Sql都提供直接的Mapping功能,这样再去做继承很麻烦。

但是实际上直接的Mapping在数据库设计非常合理的前提下,是最简单可靠的做法。

 

总而言之,EF这类工具非常高效,大幅简化开发人员花在搭建数据层所需要的时间。个人也认为,使用EF的效率是高于Hibernate和动软之类工具的。