EntityFramework(转自wiki)
维基百科
Entity Framework (又称ADO.NET Entity Framework) 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping)解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。
ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。
目录
背景
长久以来,程序员和数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的组件,这让程序员一定要为了连接与访问数据库而去学习 SQL 指令,因此在信息业中有很多人都在研究如何将程序设计模型和数据库集成在一起,对象关系对应 (Object-Relational Mapping) 的技术就是由此而生,像Hibernate或NHibernate都是这个技术下的产物,而微软虽然有了ADO.NET这个数据访问的利器,但却没有像NHibernate这样的对象对应工具,因此微软在.NET Framework 2.0发展时期,就提出了一个ObjectSpace的概念,ObjectSpace可以让应用程序可以用完全对象化的方法连接与访问数据库,其技术概念与NHibernate相当类似,然而ObjectSpace工程相当大,在.NET Framework 2.0完成时仍无法全部完成,因此微软将ObjectSpace纳入下一版本的.NET Framework中,并且再加上一个设计的工具(Designer),构成了现在的 ADO.NET Entity Framework。
Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象 (entity),而数据字段都转换为属性 (property),关系则转换为结合属性(association),让数据库的 E/R 模型完全的转成对象模型,如此让程序员能用最熟悉的编程语言来调用访问。而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和存储层,以及支持 Entity Framework 的数据提供者 (provider),让数据访问的工作得以顺利与完整的进行。
- 概念层:负责向上的对象与属性显露与访问。
- 对应层:将上方的概念层和底下的存储层的数据结构对应在一起。
- 存储层:依不同数据库与数据结构,而显露出实体的数据结构体,和 Provider 一起,负责实际对数据库的访问和 SQL 的产生。
架构
概念层结构
概念层结构定义了对象模型 (Object Model),让上层的应用程序码可以如面向对象的方式般访问数据,概念层结构是由 CSDL (Conceptual Schema Definition Language) 所撰写[1]。
一份概念层结构定义如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="EmployeesContext">
<EntitySet Name="Employees" EntityType="Employees.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="Guid" Nullable="false" />
<Property Name="LastName" Type="String" Nullable="false" />
<Property Name="FirstName" Type="String" Nullable="false" />
<Property Name="Email" Type="String" Nullable="false" />
</EntityType>
</Schema>
对应层结构
对应层结构负责将上层的概念层结构以及下层的存储体结构中的成员结合在一起,以确认数据的来源与流向。对应层结构是由 MSL (Mapping Specification Language) 所撰写[2]。
一份对应层结构定义如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS"> <EntityContainerMapping StorageEntityContainer="dbo" CdmEntityContainer="EmployeesContext">
<EntitySetMapping Name="Employees" StoreEntitySet="Employees" TypeName="Employees.Employees"> <ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Email" ColumnName="Email" /> </EntitySetMapping>
</EntityContainerMapping>
</Mapping>
存储层结构
存储层结构是负责与数据库管理系统(DBMS)中的数据表做实体对应 (Physical Mapping),让数据可以输入正确的数据源中,或者由正确的数据源取出。它是由 SSDL (Storage Schema Definition Language) 所撰写[3]。
一份存储层结构定义如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees.Store" Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2005"
xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="Employees" EntityType="Employees.Store.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="uniqueidentifier" Nullable="false" />
<Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="FirstName" Type="nvarchar" Nullable="false" />
<Property Name="Email" Type="nvarchar" Nullable="false" />
</EntityType>
</Schema>
查询对象
ADO.NET 实体数据模型工具会产生从 ObjectContext (代表概念模型中所定义的实体容器) 派生而来的类别。 ObjectContext 类别支持针对将实体当成对象传回之概念模型进行查询,也支持创建、更新和删除实体对象。 Entity Framework 支持针对概念模型进行对象查询。 这些查询可以使用 Entity SQL 、Language-Integrated Query (LINQ) 和对象查询产生器方法来撰写。[4]
Entity SQL
Entity Client 是 ADO.NET Entity Framework 中的原生客户端 (Native Client),它的对象模型和 ADO.NET 的其他客户端非常相似,一样有 Connection, Command, DataReader 等对象,但最大的差异就是,它有自己的 SQL 指令 (Entity SQL),可以用 SQL 的方式访问 EDM,简单的说,就是把 EDM 当成一个实体数据库。
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); // Set the provider name.
entityBuilder.Provider = providerName; // Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString; // Set the Metadata location.
entityBuilder.Metadata = @"res://*/AdventureWorksModel.csdl|
res://*/AdventureWorksModel.ssdl|
res://*/AdventureWorksModel.msl"; Console.WriteLine(entityBuilder.ToString()); using (EntityConnection conn = new EntityConnection(entityBuilder.ToString()))
{
conn.Open();
Console.WriteLine("Just testing the connection.");
conn.Close();
}
LINQ to Entities
实现 IEnumerable<T> 泛型接口或 IQueryable<T> 泛型接口的数据源可以通过 LINQ 进行查询。 实现泛型 IQueryable<T> 接口之泛型 ObjectQuery<T> 类别的运行个体会当做 LINQ to Entities 查询的数据源。 ObjectQuery<T> 泛型类别表示传回零个或多个具类型对象之集合的查询。 使用 C# 的 var 关键字 (在 Visual Basic 中为 Dim),您也可以让编译器推断实体类型。[5]
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<Product> products = AWEntities.Products; // LINQ Query syntax:
IOrderedQueryable<Product> query =
from product in products
orderby product.Name, product.ListPrice descending
select product; // LINQ Method syntax:
IOrderedQueryable<Product> query = products
.OrderBy(product => product.Name)
.ThenByDescending(product => product.ListPrice);
}
查询产生器方法
ObjectQuery 类别支持对概念模型进行 LINQ to Entities 和 Entity SQL 查询。 ObjectQuery 也会实现一组查询产生器方法,这些方法可用来循序建构与 Entity SQL 相等的查询命令。由于 ObjectQuery 会实现 IQueryable 和 IEnumerable,所以将 ObjectQuery 所实现的查询产生器方法结合 LINQ 特定的标准查询运算符方法 (如 First 或 Count) 是可行的。 LINQ 运算符并不会传回 ObjectQuery,与查询产生器方法不同。[6]
// Get the contacts with the specified name.
ObjectQuery<Contact> contactQuery = context.Contact
.Where("it.LastName = @ln AND it.FirstName = @fn",
new ObjectParameter("ln", lastName),
new ObjectParameter("fn", firstName));
开发工具
ADO.NET Entity Model Designer
目前 ADO.NET Entity Framework 的开发,在 Visual Studio 2008 中有充分的支持,在安装 Visual Studio 2008 Service Pack 1 后,文件范本中即会出现 ADO.NET 实体数据模型 (ADO.NET Entity Data Model) 可让开发人员利用 Entity Model Designer 来设计 EDM,EDM 亦可由Windows记事本等文本编辑器所编辑。
派生服务
微软特别针对了网络上各种不同的应用程序(例如 AJAX,Silverlight,Mashup 应用程序)开发了一个基于 ADO.NET Entity Framework 之上的服务,称为 ADO.NET Data Services(项目代号为 Astoria),并与 ADO.NET Entity Framework 一起包装在 .NET Framework 3.5 Service Pack 1 中发表。
支持厂商
目前已有数个数据库厂商或组件开发商宣布要支持 ADO.NET Entity Framework[7]:
- Mircosoft,支持MsSQL.
- Core Lab,支持Oracle、MySQL、PostgreSQL 与 SQLite 数据库。
- IBM,实现 DB2 使用的 LINQ Provider。
- MySQL,发展 MySQL Server 所用的 Provider。
- Npqsql,发展 PostgreSQL 所用的 Provider。
- OpenLink Software,发展支持多种数据库所用的 Provider。
- Phoenix Software International,发展支持 SQLite 数据库的 Provider。
- Sybase,将支持 Anywhere 数据库。
- VistaDB Software,将支持 VistaDB 数据库。
- DataDirect Technologies,发展支持多种数据库所用的 Provider。
- Firebird,支持 Firebird 数据库。
参考资料
外部链接
- (英文) MSDN Library : ADO.NET Entity Framework
- (繁体中文) 读写 ADO.NET Entity Framework
- (繁体中文) 集成 ADO.NET Entity Framework 到应用程序中
- (繁体中文) 首次接触 ADO.NET Entity Framework
- (繁体中文) ADO.NET Entity Framework 概观
- (英文) Recent ADO.NET Entity Framework provider news - Demos and downloads
其他网络资源:
https://msdn.microsoft.com/en-us/library/aa937723(v=vs.113).aspx EF MSDN官方介绍
https://msdn.microsoft.com/zh-cn/library/bb399567(v=vs.110).aspx MSDN实体框架概述
https://github.com/aspnet/EntityFramework6 EF 开源地址
https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc
/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application
https://channel9.msdn.com/Events/Connect/2016/116 EF Core官方介绍视频
https://www.nuget.org/packages/EntityFramework NuGet地址
http://www.cnblogs.com/qouoww/tag/Entity%20Framework/
http://www.jikexueyuan.com/course/entity/ 极客学院EF视频
http://blog.csdn.net/csh624366188/article/details/7065036 CSDN博客
http://www.entityframeworktutorial.net/
https://www.tutorialspoint.com/entity_framework/entity_framework_overview.htm 英文教程
https://en.wikipedia.org/wiki/Entity_Framework 维基英文版
https://ef.readthedocs.io/en/latest/ EF Core文档
https://www.youtube.com/watch?v=Z7713GBhi4k EF Youtube视频
http://www.cnblogs.com/Gyoung/archive/2013/02/04/2881747.html EF 连接 Oracle
http://www.oracle.com/technetwork/cn/articles/dotnet/vs2010-oracle-dev-410461-zhs.html EF链接Oracle
http://www.oracle.com/technetwork/cn/tutorials/408008-zhs.htm EF 配置 Oracle
https://csharp.today/entity-framework-6-database-first-with-oracle/
https://www.nuget.org/packages/Oracle.ManagedDataAccess.EntityFramework/ NuGet地址
http://www.billfogg.com/2015/02/visual-studio-2013-entity-framework-6-and-oracle-odpnet.html
http://mukul-garg.blogspot.com/2015/08/using-entity-framework-6-code-first.html
http://www.itdadao.com/articles/c15a46116p0.html
http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/2015/NuGet/NuGet.html


EntityFramework(转自wiki)的更多相关文章
- 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- EntityFramework 7 开发纪录
博文目录: 暂时开发模式 Code First 具体体现 DbContext 配置 Entity 映射关联配置 Migration 问题纪录(已解决) 之前的一篇博文:EF7 Code First O ...
- EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...
- 【EntityFramework 6.1.3】个人理解与问题记录
前言 又是一个炎热夏日的晚上,开着空调听着音乐又开始了我们今天的博文.此文并不是ROM工具哪家强之类的引战贴,只是本文自己的一点看法和见解,望前辈看官有望斧正 声明 本文欢迎转载,原文地址:http: ...
- EntityFramework.Extended 对EF进行扩展
前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...
- 采用EntityFramework.Extended 对EF进行扩展
今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这是一个对Entity Framework进行扩展的类库 ...
- [转]EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
本文转自:http://www.cnblogs.com/VolcanoCloud/p/5572408.html 官方文档英文地址:https://github.com/aspnet/EntityFra ...
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper
剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...
随机推荐
- AOJ 0118 Property Distribution (DFS)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=46522 简单DFS,题目翻译参考 http://blog.csdn.net ...
- bzoj2212 Tree Rotations
被BZOJ坑了一下午,原以为是我程序有问题一直WA,结果是我数组小了...为啥不给我RE!!! 线段树合并,对于逆序对而言,只能通过交换左右子树来达到,那么我们就可以想到对于一个结点而言,我们当然要取 ...
- Google Protocol Buffer 的使用(二)
一.protobuf应用场景 protobuf 在Java中的应用场景可以是序列化和反序列化,流可以通过文件或者通过网络TCP/UDP等方式传输.新建一个.proto文件 syntax = " ...
- AtCoder Grand Contest 011 E - Increasing Numbers(灵性乱搞)
题意: 当一个整数高位数字总不小于低位数字,或者说写成字符串之后单调不下降,称之为上升数.求一个整数最少能表示为多少个上升数的和.(n<=1e500000) 分析: 考虑那些不下降的数字,一定可 ...
- Spring Cloud(7):Zuul自定义过滤器和接口限流
上文讲到了Zuul的基本使用: https://www.cnblogs.com/xuyiqing/p/10884860.html 自定义Zuul过滤器: package org.dreamtech.a ...
- MongoDB集群搭建教程收集(待实践)
先收集,后续再实践. MongoDB的集群应该和MySQL的定位保持一致,因为要认为它就是一个数据库. 集群方式有也是有很多,比如分库,分片,主从,主主等等. 下面是收集的一些教程: http://b ...
- JSP的体系结构
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/architecture.html: Web服务器需要一个JSP引擎,即处理JSP页面的容器.JSP容器负 ...
- 分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类
一直想写一个自己的代码生成器,但是因为工作事情多,一直搁置下来,最近下决心终于利用下班时间写完了,现在分享给有需要的朋友,代码生成器集成EasyDBUtility数据库访问帮助类,暂时只支持sqlse ...
- C# 图片识别(支持21种语言)转
来自:http://www.cnblogs.com/stone_w/archive/2011/10/08/2202397.html 图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇 ...
- android 深入浅出 群内“每日一问” 问答总结
永远不变的就是变. 俗话说的好,环境改变人生. 常常面对的是一群积极奋进的人,那么你的心态和生活也会变的充满斗志.青春在于折腾,趁我们还年轻,拿出你的激情.踏着泪水载着梦,才干拥有自己的一片天空. 上 ...