艾伟:ADO.NET Entity Framework简介

简介: 下一代的ADO.NET的目标是要解决关系数据模型和实际应用程序需要模型之间的鸿沟,那么它是怎么做到的呢?我们都知道,建立在关系数据库基础之上的应用程序经常需要在不同的表之间做复杂的join操作来取得相关的数据。

下一代的ADO.NET的目标是要解决关系数据模型和实际应用程序需要模型之间的鸿沟,那么它是怎么做到的呢?

我们都知道,建立在关系数据库基础之上的应用程序经常需要在不同的表之间做复杂的join操作来取得相关的数据。

比如下面的例子:

           [图1] 

这是一个普通的关系型数据库。这个结构主要描述了雇员的基本信息和雇员的销售情况。

假如我们想取得所有在2006年1月1日招聘过来的全职员工的姓名和职务信息,那么就需要写如下的sql查询语句:

1 SELECT  c.FirstName, e.Title
2 FROM  Employee e
3 INNER   JOIN  Contact c  ON  e.EmployeeID  =  c.ContactID
4 WHERE  e.SalariedFlag  =   1   AND  e.HireDate  >=   ' 2006-01-01 '
5


我们分析一下这个复杂的sql语句,就会发现它存在如下缺点:

1. 如果某个应用程序只处理Employees的信息,但我们必须将逻辑数据关系标准化。这样我们就不得不去关注数据库表与表之间的关系(比如雇员的联系信息和姓名在不同的表中),我们需要人为地在两个表中做内联交叉查询以得到正确的数据。
2. 这里该应用程序仅仅是处理全职雇员(SalariedFlag=1),理想的情况是,我们不应看到其他类型的雇员信息。然而实际上所有的雇员信息都在一个 数据库表中,他们是用一个"SalariedFlag"字段来区分的。这就意味着我们需要关注如何将不同类型的雇员加以区分。理想的情况是这样的:假如我 们只需要处理某个数据子集,系统只需要呈现这部分子集的数据。开发人员应当能够通过声明来指定哪个是需要的数据子集。

综合地说,首先,关系数据模型不能直接匹配应用程序实际的数据模型。其次,关系数据模型不能满足应用程序的实际需要,比如应用程序还需要一些非功能性的需求,这些需求包括操作,数据拥有关系,性能和安全。

为了解决如上问题,ADO.NET引入了Entity Framework,它包含了数据模型以及一些设计时和运行时的服务。通过Entity Framework提供的更高抽象层,应用程序的数据模型就可以直接和数据库的关系数据模型交互。


Entity Data Model

Entity Data Model—简称EDM—是一个实体关系数据模型(Entity-Relationship data model). EDM的一个关键的概念如下:

Entity: Entity是实体类型的实例(例如:Employee, SalesOrder)。它由一个关键字来组织数据记录。多个Entity可以组成Entity-Sets.

RelationShip:RelationShip是关系类型的实例,它关联相关的实体.多个Relationships 可以组成 Relationship-Sets.

除了上面两个核心概念外,EDM模型还支持多种类型的扩展.

继承:实体类型可以继承于其他的类型.这种类型的继承只继承结构,不提供向面向对象语言的"行为"继承.

复合类型:定义一个复合类型Address,它可以由StreetAddress, City 和State这些属性复合而成.


我们按照EDM的概念重新定义[图1]:

             [图2]
这里描述了如下元素:
三个实体类型,分别是SalesPerson,SalesOrder和StoreSalesOrder。其中StoreSalesOrder继承自SalesOrder。
一个关系: SalesOrder 和 SalesPerson 之间的关系。
两个实体集(entity-sets):SalesOrders 和 SalesPeople。 实体集SalesOrders 拥有SalesOrder和StoreSalesOrder两个实体类型。

看看上面的模型视图已经更接近应用程序需求了。其中SalesPerson的信息已经不再分布在不同的数据表中了,同时也没有了主从键了。

比如以前这样的查询:

1 SELECT  sp.FirstName, sp.LastName, sp.HireDate
2 FROM  SalesPerson sp
3 INNER   JOIN  Employee e  ON  sp.SalesPersonID  =  e.EmployeeID
4 INNER   JOIN  Contact c  ON  e.EmployeeID  =  c.ContactID
5 WHERE  e.SalariedFlag  =   1   AND  e.HireDate  >=   ' 2006-01-01 '
6

现在只需写成:

1 SELECT  sp.FirstName, sp.LastName, sp.HireDate
2 FROM  SalesPeople  AS  sp
3 WHERE  sp.HireDate  >=   ' 2006-01-01 '



更多关于ADO.NET Entity Framework相关的介绍, 英文好的朋友可以参阅:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/ADONET_EDM.asp
以及
http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnvs05/html/ADONETEnFrmOvw.asp

目录
相关文章
|
2月前
|
SQL 开发框架 .NET
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
67 0
|
开发框架 .NET 数据库
ASP.NET Core Identity自定义数据库结构和完全使用Dapper而非EntityFramework Core
ASP.NET Core Identity自定义数据库结构和完全使用Dapper而非EntityFramework Core前言原本本节内容是不存在的,出于有几个人问到了我:我想使用ASP.NET Core Identity,但是我又不想使用默认生成的数据库表,想自定义一套,我想要使用ASP.NE Core Identity又不想使用EntityFramework Core。
1017 0
|
存储 .NET 关系型数据库
.net core Entity Framework 与 EF Core
重点讲 Entity Framework Core ! (一)Entity Framework            它是适用于.NET 的对象关系映射程序 (ORM),现在的EF6已经是久经沙场,并经历重重磨难,获得一致认可的数据访问技术(原来加 Title 也挺有意思的,哈哈哈)。
1547 0
|
SQL 前端开发 .NET
Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)
原文:Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货) 接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理。
1136 0
|
SQL .NET 数据库
ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Framework Core 上一章节学习完了视图,其实我们应该立即着手讲解模型的,但 ASP.
1454 0
|
.NET 数据库 开发框架
ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查
原文:ASP.NET CORE系列【二】使用Entity Framework Core进行增删改查 介绍 EntityFrameworkCore EF core 是一个轻量级的,可扩展的EF的跨平台版本。
1618 0
|
.NET 开发框架 中间件
ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查
原文:ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查 身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了。我们来看看在Core里面如何配置; 首先需要NuGet安装一个包:Microsoft.
1752 0
|
SQL .NET 数据库
ASP.NET CORE系列【六】Entity Framework Core 之数据迁移
原文:ASP.NET CORE系列【六】Entity Framework Core 之数据迁移 前言 最近打算用.NET Core写一份简单的后台系统,来练练手 然后又用到了Entity Framework Core  发现园子里有些文章讲得不是那么细节,对于新手小白来说,可能会有点懵。
1518 0
|
API C++ iOS开发
.net Core 2.1.x EntityFramework | 无法找到DatabaseGeneratedAttribute注释
.net Core 2.1.x EntityFramework | 无法找到DatabaseGeneratedAttribute注释 1向下投票最喜爱的   我正在尝试为我的应用程序使用.Net Entity Framework Core。
1651 0
|
.NET Shell 数据库
ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写死在程序里, 有的习惯把它放在launchSettings.
1331 0