EF 总结
来源:互联网 发布:java实现二叉树的创建 编辑:程序博客网 时间:2024/04/30 20:42
ADO.NET Entity Framework
ADO.NET 实体框架概念最初是在 2006 年作为 ADO.NET vNext 引入的,现在它已准备好要在即将发布的 Visual Studio® 2008 SP1 中大显身手。在历经多年对类似产品的多次失败尝试后,Microsoft 随 Visual Studio 2008 发布了部分适合于对象关系映射 (ORM) 空间的下列两种技术:LINQ to SQL 和 ADO.NET Entity Framework。随着市场逐渐开始采用这些技术,开发人员希望了解我们目前的状况以及 Microsoft 未来的发展方向。他们还希望了解这些技术开发背后的原理、实体框架不同于市场上其他 ORM 技术的原因以及 Microsoft 对这些技术的投资趋向。
在 Visual Studio 2008 发布伊始,就出现了大量有关 LINQ to SQL 的文章以及介绍应采用哪种技术的文章(请参阅 msdn.microsoft.com/data)。在此我将着重介绍实体框架,并深入探讨在开发过程中应该如何进行选择以及为何如此选择。
Microsoft® 实体数据模型 (EDM) 基于 Peter Chen 博士的实体关系 (ER) 模型,实际上它是 ADO.NET Entity Framework 背后的驱动力。EDM 也是区分实体框架与市场上其他 ORM 型技术的最明显特征。EDM 构建在 ER 模型之上,它将模型的抽象级别提升到高于逻辑模型的级别,但同时仍保留实体和关系的概念。
参照链接:http://msdn.microsoft.com/zh-cn/data/aa937723(en-us).aspx
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
Entity SQL (ESQL)
Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM)。Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询。
l 关键字
Value关键字
ESQL 提供了 SELECT VALUE 子句以跳过隐式行构造。SELECT VALUE 子句中只能指定一项。在使用这样的子句时,将不会对 SELECT 子句中的项构造行包装器,并且可生成所要形状的集合,例如:SELECT VALUE it FROM NorthwindEntities.Customers as it
it关键字
it 出现在 ESQL 中, 查询对象的别名默认值 "it" 改成其他字符串,例如:
"SELECT VALUE it FROM NorthwindEntities.Customers as it " 。
l 注释:
Entity SQL 查询可以包含注释。注释行以两个短划线 (--) 开头。
"SELECT VALUE it FROM NorthwindEntities.Customers as it -- this a comment "
l Select查询
例如:
SELECT VALUE it FROM NorthwindEntities.Customers as it
l 参数
参数是在esql之外定义的变量,每个参数都有名称和类型,参数名称在查询表达式中定义,并以@符号作为前缀。例如:
Select VALUE c from NorthwindEntities.Customers as c where c.CustomerID=@customerID
l 聚合
Enity SQL不支持 * ,所以esql不支持count(*),而是使用count(0),例如:
Select count(0) from NorthwindEntities.Customers
l 分页SKIP/LIMIT
可以通过在 ORDER BY 子句中使用 SKIP 和 LIMIT 子句执行物理分页。若要以确定的方式执行物理分页,应使用 SKIP 和 LIMIT。如果您只是希望以非确定的方式限制结果中的行数,则应使用 TOP。TOP 和 SKIP/LIMIT 是互斥的
使用SKIP/LIMIT分页,esql代码如下:
Select value c from NorthwindEntities.Customers as c order by c.CustomerID skip 0 limit 10
l TOP
SELECT 子句可以在可选的 ALL/DISTINCT 修饰符之后具有可选的 TOP 子子句。TOP 子子句指定查询结果中将只返回第一组行。esql代码如下:
Select top(10) c.CustomerID from NorthwindEntities.Customers as c order by c.CustomerID
l NULL处理
Null 文本与 Entity SQL 类型系统中的任何类型都兼容,可以使用cast进行类型转换,例如:
select cast(c.region as string) from NorthwindEntities.Customers as c order by c.CustomerID limit 10
其中, Nvarchar等可以成string,数字类型可以转成int32,其他的类型转换类似。如果无法完成转换,则将报异常。还有可以处理的方法有treat。
l 标识符
Entity SQL 提供两种标识符:简单标识符和带引号的标识符
简单标识符:Entity SQL 中的简单标识符是字母数字和下划线字符的序列。标识符的第一个字符必须是字母字符(a-z 或 A-Z)。
带引号的标识符:带引号的标识符是括在方括号 ([]) 中的任何字符序列。带中文的部分,请使用方括号包括起来,否则会报如下异常信息:“简单标识符“中文”只能包含基本拉丁字符。若要使用UNICODE 字符,请使用转义标识符”
正确的代码如下:
Select c.CustomerID as [中文字符] from NorthwindEntities.Customers as c order by c.CustomerID skip 0 limit 10
l ROW
Esql可使用row来构建匿名的结构类型的纪录。例如:
SELECT VALUE row(p.ProductID as ProductID,p.ProductName as ProductName) FROM NorthwindEntities.Products as p order by p.ProductID LIMIT 10
l Key
提取引用或实体表达式的键。如下esql语句,直接返回Customer表的主键:
string esql = "SELECT value key(c) FROM NorthwindEntities.Customers as c order by c.CustomerID LIMIT 10"
l CreateRef/ref/deref
CreateRef创建对实体集中的实体的引用。
ref返回对实体实例的引用,之后就可以当作实体来访问其属性,esql语句如下:
SELECT ref(c).CustomerID FROM NorthwindEntities.Customers as c order by c.CustomerID LIMIT 10
deref运算符取消引用一个引用值,并生成该取消引用的结果。
l CASE语句:
string esql = "using SqlServer;select case when len(trim(c.CustomerID))==0 then true else false end from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
l 运算符
Esql支持的运算符有:加+、减-、乘*、除/、取模%、-负号。Esql语句如下:
select 100/2 as OP from NorthwindEntities.Customers as c order by c.CustomerID limit 10
l 比较运算符
Esql支持的比较运算符有:=,>,>=,IS [NOT] NULL,<,[NOT] BETWEEN,!=,<>,[NOT] LIKE。Esql语句如下:
select value p from NorthwindEntities.Products as p where p.UnitPrice > 20 order by p.ProductID limit 10
l 逻辑运算符
Esql支持的逻辑运算符有:and(&&),not(!),or(||)。Esql语句如下:
select value p from NorthwindEntities.Products as p where p.UnitPrice > 20 and p.UnitPrice<100 order by p.ProductID limit 10
或
select value p from NorthwindEntities.Products as p where p.UnitPrice > 20 && p.UnitPrice<100 order by p.ProductID limit 10
l 字符串连接运算符。
加号 (+) 是 Entity SQL 中可将字符串串联起来的唯一运算符。Esql语句如下:
select c.CustomerID + c.ContactName from NorthwindEntities.Customers as c order by c.CustomerID limit 10
l 嵌套查询
在 Entity SQL 中,嵌套查询必须括在括号中,将不保留嵌套查询的顺序
select c1.CustomerID from( select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10) as c1
l 日期时间函数
Esql提供的日期时间函数有:CurrentDateTime()获取当前服务器的日期时间,还有month,day,year,second, Minute ,Hour等。例如:
select CurrentDateTime() from NorthwindEntities.Customers as c order by c.CustomerID limit 10
l 字符串函数
Esql提供的字符串函数有:Concat,IndexOf,Left,Length,Ltrim,Replace,Reverse,Rtrim,SubString,Trim,ToLower,ToUpper.例如:
select Reverse(p.ProductName) as ProductName from NorthwindEntities.Products as p order by p.ProductID limit 10
l GUID
Esql提供newguid()函数,产生一个新的Guid。例如:
select newguid() from NorthwindEntities.Customers as c order by c.CustomerID limit 10
l 数学函数:
Abs,Ceiling,Floor,Round
l 统计函数:
Avg,BigCount,Count,Max,Min,StDev,Sum
l 位计算函数
如果提供 Null 输入,则这些函数返回 Null。这些函数的返回类型与参数类型相同。如果函数采用多个参数,则这些参数必须具有相同的类型。若要对不同类型执行位运算,则需要显式强制转换为相同类型.
BitWiseAnd,BitWiseNot,BitWiseOr,BitWiseXor
l 命名空间
Entity SQL 引入命名空间以避免全局标识符(如类型名称、实体集、函数等)出现名称冲突。Entity SQL 中的命名空间支持与 .NET Framework 中的命名空间支持类似。
Entity SQL 提供两种形式的 USING 子句:限定命名空间(其中,提供较短的别名以表示命名空间)和非限定命名空间,如下例所示:
USING System.Data;
USING tsql = System.Data;
例如:
string esql = "using System; select cast(p.UnitPrice as Int32) from NorthwindEntities.Products as p order by p.ProductID limit 10 ";
string esql = "using System;using SqlServer; select (cast(p.UnitPrice as Int32)),SqlServer.ltrim(p.ProductName) as nameLen from NorthwindEntities.Products as p order by p.ProductID limit 10 ";
最后,简单说一下Esql与T-Sql的某些差异:
l Entity SQL 中的所有列引用都必须用表别名限定.
l Esql不支持Any,all限定运算符以及*运算
l Entity SQL 当前未提供对 DML 语句(insert、update、delete)的支持。
l Entity SQL 的当前版本未提供对 DDL 的支持。
System.Data.Objects命名空间
System.Data.Objects 命名空间包含一些类,用于提供对对象服务的核心功能的访问。这些类使您可以藉由作为实体类型实例的强类型 CLR 对象来查询、插入、更新和删除数据。对象服务支持针对实体数据模型 (EDM) 中定义的类型进行的语言集成查询 (LINQ) 和实体 SQL 查询。对象服务将返回的数据具体化为对象,并将对象更改传播回数据源。它还提供了用于跟踪更改、将对象绑定到控件以及处理并发问题的功能。
类
说明
&
CompiledQuery
表示一个缓存的 LINQ to Entities 查询。
&
CurrentValueRecord
提供对对象数据的当前值的访问。
DbUpdatableDataRecord
提供对对象数据的原始值的访问。DbUpdatableDataRecord 实现可用于更新对象的原始值的方法。
EntityFunctions
提供在 LINQ to Entities 查询中,公开概念模型规范函数的公共语言运行时 (CLR) 方法。有关规范函数的信息,请参见Canonical Functions (Entity SQL)。
&
ObjectContext
提供用于查询和使用对象形式的实体数据的功能。
ObjectContextOptions
定义影响 ObjectContext 的行为的选项。
ObjectMaterializedEventArgs
包含 ObjectMaterialized 事件的数据。
&
ObjectParameter
表示传递给对象查询的查询参数。
ObjectParameterCollection
将查询参数表示为 ObjectQuery<T> 中定义的 ObjectParameter 对象。
&
ObjectQuery
实现使用 LINQ to Entities 和 ObjectQuery<T> 对概念模型执行查询的通用功能。
&
ObjectQuery<T>
表示在给定的对象上下文中针对概念模型的类型化查询。
&
ObjectResult
表示针对概念模型的对象查询的结果的基类。
&
ObjectResult<T>
以对象的可枚举集合形式表示 ObjectQuery<T> 的结果。
ObjectSet<TEntity>
表示用于执行创建、读取、更新和删除操作的类型化实体集。
&
ObjectStateEntry
维护对象和关系的状态和键信息以及对象属性的更改跟踪。
&
ObjectStateManager
维护实体类型实例和关系实例的对象状态和标识管理。
OriginalValueRecord
提供对对象数据的原始值的访问。
ProxyDataContractResolver
此类可帮助将为持久性未知数据类创建的代理类型解析为持久性未知对象的实际类型。
参照链接: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
VS2010自带的 T4 模板介绍
ADO.NET EntityObject Generator
ADO.NET EntityObject 生成器, 把 edmx 文件中的内联代码摘出来
ADO.NET POCO Entity Generator
ADO.NET自跟踪实体生成器,生成 POCO(Plain Old CLR Object) 实体,其包括每个表所映射的实体及一个Context,POCO 中不会包含持久化相关的代码(这个模板非内置,可以在线上模板中找到)
ADO.NET Self-Tracking Entity Generator - POCO 的加强版,在 POCO 的基础上增加了实体状态自跟踪的功能
POCO参照链接:
下载地址:
http://visualstudiogallery.msdn.microsoft.com/zh-tw/23df0450-5677-4926-96cc-173d02752313
资料链接:
http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the-experience.aspx
http://blogs.msdn.com/b/adonet/archive/2009/05/28/poco-in-the-entity-framework-part-2-complex-types-deferred-loading-and-explicit-loading.aspx
http://blogs.msdn.com/b/adonet/archive/2009/06/10/poco-in-the-entity-framework-part-3-change-tracking-with-poco.aspx
T4模板引擎 http://home.cnblogs.com/group/topic/10272.html
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类型的参数。
其他一些问题。
注意:在执行查询,插入,更新和删除的存储过程时,查询和插入,更新和删除用法不同,在调用时需显示调用
原文参照链接:
http://www.cnblogs.com/JosephLiu/archive/2010/03/10/1682183.html
http://www.cnblogs.com/snowdream/archive/2008/12/06/use-stored-procedure-in-adonet-entity-framework.html
存储过程的执行效率比较:
参考资料:http://www.cnblogs.com/subway-2008/archive/2009/01/04/1367730.html
工具
eSqlBlast
LINQPad
- EF总结--EF简介
- EF 总结
- ef
- EF
- EF
- EF
- EF
- EF
- EF学习总结——CodeFirst
- EF总结--模型创建和数据的增删改查
- 【EF】浅谈EF
- ERF EF
- VS2010 EF
- EF Migrations
- EF二三事
- EF TMD
- ef学习
- EF入门
- 从drawable下面的图片 创建一个Bitmap
- C实现bitmap位图
- HashMap hash方法分析
- RemObject解决自动生成代码的想法
- 企业即时通讯软件FreeEIM飞鸽传书
- EF 总结
- nagios 使用MSN 发报警消息
- declspec(dllexport)与_declspec(dllimport
- 盛大资深软件工程师谈Android开发经验
- Event propagation事件传播
- 畅想:独立于框架的Model集中验证
- GDB调试精粹及使用实例
- C#视频类
- TCP缓冲区大小及限制