2.2 Database First开发方式

DatabaseFirst又叫数据库优先的开发方式,是一种比较旧的开发方式,现在越来越多的企业已经不再使用此种开发方式。当然,对于一些旧项目进行升级,在已经有了数据库的情况下,使用此种方式还是十分方便的。

2.2.1创建Dtabase First Demo

1.创建控制台项目

选择“新建→项目→Windows→控制台应用程序”,如图2-3所示。

图2-3

2.创建数据库(添加表)

CREATE TABLE [dbo].[T_Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](32) NULL,
    [Age] [int] NULL,
    [Address] [nvarchar](64) NULL,
 CONSTRAINT [PK_T_Customer] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH  (PAD_INDEX    =  OFF,  STATISTICS_NORECOMPUTE    =  OFF,  IGNORE_DUP_KEY  =  OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

3.在项目中添加“数据实体模型”

(1)右击项目,选择“添加新项”,如图2-4所示添加新项。

图2-4

(2)单击“下一步”按钮,选择“从数据库生成”,如图2-5所示生成数据。

图2-5

(3)新建数据库连接,如图2-6所示。

(4)在EF中是可以直接调用存储过程、视图、函数的,这里先只选择一张表,如图2-7所示。单击“完成”按钮,最后的展示效果如图2-8所示。

图2-6

图2-7

图2-8

(5)在代码中添加访问上下文保存到数据库的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFDemo
{
    class Program
    {
      static void Main(string[] args)
      {
          DemoSiteEntities entity = new DemoSiteEntities();
          T_Customer   customer   =   new   T_Customer   {   Address=" 东海五彩金轮
", Age=27, UserName="楚留香"};
          entity.T_Customer.Add(customer); //这里只相当于构造SQL语句
          entity.SaveChanges(); //这里才进行数据库操作,相当于按F5执行
      }
    }
}

EF在SaveChanges的时候会遍历上下文容器里的每个代理对象,然后根据代理对象的State属性生成不同的SQL语句,再一次性地发到数据库中执行。

执行后,我们看到数据库中已经插入了一条数据,如图2-9所示。

图2-9

2.2.2 EF原理

1.实体数据模型(EDM)

EF中存在一个主要的文件:*.edmx,这就是EF的核心。我们来看一下edmx文件里面到底有什么,如图2-10~图2-12所示。

图2-10

图2-11

图2-12

在EF中的实体数据模型(EDM)由以下3种模型和具有相应文件扩展名的映射文件进行定义。

● 概念架构定义语言文件(.csdl):定义概念模型。

● 存储架构定义语言文件(.ssdl):定义存储模型。

● 映射规范语言文件(.msl):定义存储模型与概念模型之间的映射M。

实体框架使用这些基于XML的模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。EDM甚至支持将概念模型中的实体映射到数据源中的存储过程。EF以EDM(Entity DataModel)为主,其上还有Entity Client、Object Service以及LINQ可以使用,如图2-13、2-14所示。

图2-13

图2-14

2. EF中操作数据库的网关:ObjectContext

ObjectContext封装.NET Framework和数据库之间的连接。此类用作创建、读取、更新和删除操作的网关。如图2-15所示。

ObjectContext类为主类,用于与作为对象(这些对象为EDM中定义的实体类型的实例)的数据进行交互。

ObjectContext类的实例封装以下内容:

● 到数据库的连接,以EntityConnection对象的形式封装。

● 描述该模型的元数据,以MetadataWorkspace对象的形式封装。

● 用于管理缓存中持久保存的对象的ObjectStateManager对象。

图2-15

3. EF执行原理

在.NET中有两项重要的技术:反射和特性。

EDM中利用特性来标识实体映射到具体数据库中的TableName,属性对应的具体表的ColumnName,还有主键、外键、默认值等,都用特性来标识。然后通过反射技术,从EF中edmx元数据获取数据库表的结构的描述,再根据增删改查操作方法,就可以产生对应的SQL语句,然后发送给ADO.NET,最终由ADO.NET负责从数据库中读取数据,返回给我们的EF。