ADO.NET Entity Framework
一、引言
在ORM盛行的今天,微软给出了Linq To Sql,鉴于Linq To Sql不能灵活的定义对象模型与数据表之间的映射、无法扩展提供程序只能支持SQL Server等缺点,微软给出了
ADO.NET Entity Framework。
二、简介
Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性 (association),让数据库的 E/R 模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层(conceptual)、对应层(mapping)和储存层(storage),以及支持 Entity Framework 的数据提供者 (provider),让数据访问的工作得以顺利与完整的进行。ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层:
(1) 概念层:负责向上的对象与属性显露与访问,让上层的应用程序码可以如面向对象的方式般访问数据。这部分由设计器自动生成,表现在一系列的类。
(2) 对应层:将上方的概念层和底下的储存层的数据结构对应在一起,负责将上层的概念层结构以及下层的储存体结构中的成员结合在一起,以确认数据的来源与流向。这部分由描述语言实现,可以自由修改。
(3) 储存层:依不同数据库与数据结构,而显露出实体的数据结构体,负责与数据库管理系统 (DBMS) 中的数据表做实体对应 (Physical Mapping),让数据可以输入正确的数据来源中,或者由正确的数据来源取出。
三、认识EDM
实体数据模型(Entity Data Model),简称EDM,由概念模型、映射模型、存储模型组成。概念模型用概念架构定义语言文件 (.csdl)来定义,映射模型用映射规范语言文件 (.msl),存储模型
用存储架构定义语言文件 (.ssdl)来定义。EDM模型在项目中的表现形式是.edmx文件,可以使用VS2010设计器打开和编辑。当用xml格式打开该模型时,我们可以清楚的看到
(1)CSDL
CSDL定义了EDM或者说是整个程序的灵魂部分 – 概念模型。当前流行的软件设计方法通常都是由设计其概念模型起步。说概念模型可能比较抽象一个更容易接受的名字就是实体类。实体
类是面向对象设计中一个最根本的组成部分,其体现了现实世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的。CSDL这个文件完全以程序语言的
角度来定义模型的概念。即其中定义的实体、主键、属性、关联等都是对应于.NET Framework中的类型。
(2)SSDL
这个文件中描述了表、列、关系、主键及索引等数据库中存在的概念。
(3)MSL
这个文件即上面所述的CSDL与SSDL的对应,主要包括CSDL中属性与SSDL中列的对应.
四、操作EDM
当定义好 Entity Data Model 的 CS/MS/SS 之后,即可以利用 ADO.NET Entity Framework 的用户端来访问 EDM,EDM 中的数据提供者会向数据来源访问数据,再传回用户端。
对于访问者(上层的逻辑)而言,可以使用三种方式访问EDM:Entity Client,Object Service 以及ObjectContext+LINQ
(1)Entity Client+EntitySql
Entity Client是 ADO.NET Entity Framework 中的本地用户端 (Native Client),它的对象模型和 ADO.NET 的其他用户端非常相似,一样有 Connection, Command, DataReader 等对象,
但最大的差异就是,它有自己的 SQL 指令 (Entity SQL),可以用 SQL 的方式访问 EDM,简单的说,就是把 EDM 当成一个实体数据库。
string city = "London";
using (EntityConnection cn = new EntityConnection("Name=Entities"))
{
cn.Open();
EntityCommand cmd = cn.CreateCommand();
cmd.CommandText = @"SELECT VALUE c FROM Entities.Customers AS c WHERE
c.Address.City = @city";
cmd.Parameters.AddWithValue("city", city);
DbDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (rdr.Read())
Console.WriteLine(rdr["CompanyName"].ToString());
rdr.Close();
}
(2)Object Service+EntitySql
在有EntityClient+EntitySQL这种使用方式下,使用ObjectService+EntitySQL的方式是多此一举,不会得到任何编辑时或运行时的好处。
(3)Object Context+Linq
Object Context 将 EDM 的访问改变为一种对对象集合的访问方式,这也就让 LINQ 有了发挥的空间,因此 LINQ to Entities 也就由此而生,简单的说,就是利用 LINQ 来访问 EDM,让 LINQ 的功能可
以在数据库中发挥。
DBForEntityEntities db = new DBForEntityEntities();
ObjectQuery<Student> students = db.Student;
IQueryable<Student> Que =
from p in students
select p;
五、EntityFramework图例
六、相关网站
http://www.cnblogs.com/lsxqw2004/archive/2009/05/31/1495240.html