项目伊始,创建数据库交互层代码是底层框架的首要任务。常用的做法包括手动编码、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的工作流程示例。
实际上,EF支持从数据表建立实体类,从实体类生成数据表以及从数据库设计(DB Model)自动创建实体类和数据表。
如此可以直接大幅降低花费在数据库设计、建表和写实体类的工作。毕竟那是码农们干的事情,程序员怎么可以这么浪费时间呢。
目前为止,EF6应该是最新的。接下来从 table -> Domain Class的模式出发,简单介绍EF的使用。
VS里自己集成了EF,创建EF的数据层的步骤是:为解决方案添加数据库连接,之后在解决方案下新建项目作为数据交互层,再在该项目下新建EF。
1. 建立数据库连接。
2. 创建ADO.Net 数据库实体
3. 选择Code First, 这里我是已经存在数据库了。
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的安装以便正常读取到数据库连接配置。
查询结果, 数据量 1067189, 最新纪录上传时间是11:54:25.777。
相信EF的优势已经有所体现。当然个人暂时认为是存在一定不足的,比如说业务表设计中是可以使用继承方式简化一部分操作,而无论EF、Hibernate还是 Linq2Sql都提供直接的Mapping功能,这样再去做继承很麻烦。
但是实际上直接的Mapping在数据库设计非常合理的前提下,是最简单可靠的做法。
总而言之,EF这类工具非常高效,大幅简化开发人员花在搭建数据层所需要的时间。个人也认为,使用EF的效率是高于Hibernate和动软之类工具的。