ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架,它使开发人员可以通过对象模型(而不是逻辑/关系数据模型)专注于数据。实体框架Entity Framework使用概念层、映射层和逻辑层将逻辑数据库结构抽象化。
ADO.NET Entity Framework是建立在关系数据库上的一种抽象概念模型(Conceptual Model)框架。
术语说明:
- Data Source: 我们所熟知的数据库或其他可能的数据源,SQL Server、Oracle、DB2、MySQL 等等。
- Data Providers: ADO.NET Data Provider,目前很多数据库厂商都提供了 EF 所需的 Data Provider。
- Entity Data Model (EDM): EF 用 CSDL、SSDL、MSL 三种专用语言来描述概念架构、存储架构和映射关系。
- Entity Client: 一组低阶数据访问 API,允许我们用类似 ADO.NET DbCommand 方式进行操作。
- Object Services: 提供 Entity Object 操作所需的各类功能,包括状态跟踪和缓存等等。
- Entity SQL (ESQL): 一种类似 T-SQL 且面向对象的查询语言,地位类似 Hibernate HQL,大大增强了复杂查询能力。
- LINQ to Entities: 和LINQ to SQL语法差不多
Entity Data Model (EDM)
实体框架的核心位于其模型中。实体框架支持表示数据库中的关系架构的逻辑存储模型。关系数据库通常存储数据的方式与应用程序使用数据的方式不同。通常,这会迫使开发人员按照数据库包含数据的结构检索数据。因此,开发人员通常将数据加载到更适合处理业务规则的业务实体中。在本示例中,以逻辑模型表示关系数据库的构架,业务实体表示概念模型。实体框架使用映射层在模型之间搭建了桥梁。因此,实体框架的模型中有三个处于活动状态的层:
- 1. Conceptual schema definition language (CSDL)
概念层(Conceptual layer) - 表示数据的概念模型,包括实体和相互关系
- 2. Store schema definition language (SSDL)
逻辑层(Logical layer)- 描述数据在数据库的存储模型。
- 3. Mapping specification language (MSL)
映射层(Mapping layer) - 在概念层和逻辑层模型之间建立映射。
这三层允许将数据从关系数据库映射到更加面向对象的业务模型。实体框架提供了使用 XML 文件定义这些层的方法。它还基于概念模型的架构生成了一系列类。可以针对这些类进行编程以直接与数据交互。这提供了抽象级别,因此开发人员可以针对概念模型而不是关系模型进行编程。
LINQ to Entities
LINQ to Entities 查询使用对象服务基础结构。ObjectContext 类是作为 CLR 对象与 实体数据模型 进行交互的主要类。
Feature |
LINQ to SQL |
LINQ to Entities |
Language Extensions Support |
Y |
Y |
Language Integrated Database Queries |
Y |
Y |
Many-to-Many (3way Join/Payload relationship) |
N |
N |
Many-to-Many (No payload) |
N |
Y |
Stored Procedures |
Y |
N (to be added) |
Entity Inheritance |
N |
Y |
Single Entity From Multiple Tables |
N |
Y |
Identity Management / CRUD features |
Y |
Y |
LINQ to SQL适用之场景
- 想使用ORM方案,而且数据库数据定义与对象模型是1:1对应关系
- 想使用ORM方案,而且对象继承结构储存在单一数据表中(单表继承)
- 想使用原始CLR类,而不是使用生成的类或需要从某个基类继承而来,或者需要实现某个接口
- 想使用LINQ来编写查询
- 想使用ORM,但需要性能非常好,可以通过存储过程和编译的查询来优化性能
注意,跟外面的一些传说相反,LINQ to SQL是支持对象继承的,虽然只支持常见的三种继承模式中的一种,LINQ to SQL也支持使用外部映射文件。
LINQ to Entities主要的应用场景针对的是需要非常灵活和更复杂的映射的场景,特别是在企业应用方面,而且需要访问其他的数据库系统。在这些场景中,数据表的结构与对象模型也许差别很大,而且应用开发人员往往并不拥有生成或修改数据库数据定义的权利。
LINQ to Entities适用之场景
- 想要开发针对微软SQL Server或其他数据库系统的应用
- 想要定义领域模型,并以之为持久层的基础
- 想要使用ORM方案,对象也许与数据库数据定义有1:1对应关系,也许结构迥异
- 想要使用支持单表继承和其他储存方案(每类一表,每具体类一表)的ORM方案
- 想使用LINQ来编写查询,并且查询可以在不同数据库系统下工作
- 想使用ORM,但需要性能非常好,可以通过存储过程和编译的查询来优化性能
原文参照链接:http://blog.joycode.com/saucer/archive/2008/02/09/114500.aspx
System.Data.Objects命名空间
System.Data.Objects 命名空间包含一些类,用于提供对对象服务的核心功能的访问。这些类使您可以藉由作为实体类型实例的强类型 CLR 对象来查询、插入、更新和删除数据。对象服务支持针对实体数据模型 (EDM) 中定义的类型进行的语言集成查询 (LINQ) 和实体 SQL 查询。对象服务将返回的数据具体化为对象,并将对象更改传播回数据源。它还提供了用于跟踪更改、将对象绑定到控件以及处理并发问题的功能。
类 |
说明 |
|
& |
表示一个缓存的 LINQ to Entities 查询。 |
|
& |
提供对对象数据的当前值的访问。 |
|
提供对对象数据的原始值的访问。DbUpdatableDataRecord 实现可用于更新对象的原始值的方法。 |
||
提供在 LINQ to Entities 查询中,公开概念模型规范函数的公共语言运行时 (CLR) 方法。有关规范函数的信息,请参见Canonical Functions (Entity SQL)。 |
||
& |
提供用于查询和使用对象形式的实体数据的功能。 |
|
定义影响 ObjectContext 的行为的选项。 |
||
包含 ObjectMaterialized 事件的数据。 |
||
& |
表示传递给对象查询的查询参数。 |
|
将查询参数表示为 ObjectQuery<T> 中定义的 ObjectParameter 对象。 |
||
& |
实现使用 LINQ to Entities 和 ObjectQuery<T> 对概念模型执行查询的通用功能。 |
|
& |
表示在给定的对象上下文中针对概念模型的类型化查询。 |
|
& |
表示针对概念模型的对象查询的结果的基类。 |
|
& |
以对象的可枚举集合形式表示 ObjectQuery<T> 的结果。 |
|
表示用于执行创建、读取、更新和删除操作的类型化实体集。 |
||
& |
维护对象和关系的状态和键信息以及对象属性的更改跟踪。 |
|
& |
维护实体类型实例和关系实例的对象状态和标识管理。 |
|
提供对对象数据的原始值的访问。 |
||
此类可帮助将为持久性未知数据类创建的代理类型解析为持久性未知对象的实际类型。 |
参照链接:http://msdn.microsoft.com/zh-cn/library/bb358246.aspx
System.Data.Objects.DataClasses 命名空间
System.Data.Objects.DataClasses 命名空间包含以下这些类:实体数据模型 (EDM) 中定义的类型的基类、由导航属性返回的类型的基类以及用于定义将公共语言运行时 (CLR) 对象映射到概念性模型中的类型的特性的类。
例:EDM 框架模型生成的.cs 代码
参照链接:http://msdn.microsoft.com/zh-cn/library/system.data.objects.dataclasses.aspx
ADO.NET Entity Framework 4.0 新特性
- 外键支持(Foreign Keys)
- 延迟加载支持(Lazy Loading)
- 简单传统CLR对象(Plain Old CLR Object)支持
- 文本模板转换工具集(Text Template Transformation Toolkit)代码生成 (T4)
- 更好的N层设计(N-Tier)支持
- 改进SQL语句的生成(新增对T-SQL 的支持)
- 增强对存储过程(Stored Procedure)的支持
原文参照链接:http://msdn.microsoft.com/zh-cn/downloads/ee959227.aspx
http://space.itpub.net/?uid-12639172-action-viewspace-itemid-665514
Oracle Support
同linq connection 链接oracle 数据库一样
参照链接:http://www.devart.com/dotconnect/entityframework.html
Entity Framework Query Samples
http://www.devart.com/dotconnect/efquerysamples.html
存储过程调用
EF对存储过程的支持并不完善。存在以下问题:
EF不支持存储过程返回多表联合查询的结果集。
EF仅支持返回返回某个表的全部字段,以便转换成对应的实体。无法支持返回部分字段的情况。
虽然可以正常导入返回标量值的存储过程,但是却没有为我们自动生成相应的实体.cs代码,我们还是无法在代码中直接调用或使用标量存储过程
EF不能直接支持存储过程中Output类型的参数。
其他一些问题
注意:在执行查询,插入,更新和删除的存储过程时,查询和插入,更新和删除用法不同,在调用时需显示调用