
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。