Entity Framework(实体框架 EF)
什么是Entity Framework呢(下面简称EF)?
EF(实体框架)是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。ORM(对象关系映射框架):指的是面向对象的对象模型和关系型数据库的数据结构之间的相互转换。
如此官方的解释,你懂吗? 我理解的是,业务实体在内存中表现为对象,在数据库中表现为数据,内存中的对象之间,存在关联和继承关系,而在数据库中,关系数据无法直接表达这些关系。而对象-关系映射(ORM)就是解决这一问题的。ORM作为一个中间件,实现程序对象到关系数据库的数据映射。那么,EF也就是一种实现数据库和程序中的实体相互映射的一种工具。(我的理解,如果有误,欢迎指出)
EF的核心是什么呢?
EF的核心,就是EDM(实体数据模型),EDM是一个规范,用于定义由实体框架基础上生成的应用程序使用的数据。使用EDM
的应用程序在设计架构中定义应用程序域中的实体和关系。设计架构用于生成由应用程序代码使用的可编程类。在此模型中持久保留应用程序数据的存储结构由另一个架构(称为存储架构)表示。映射规范用于连接设计架构与存储架构。简单理解,就是定义出实体和数据库的对应关系。
EDF有三个概念组成:概念模型(概念架构定义语言文件[.csdl])、映射(映射规范语言文件[.msl])、以及存储模型(存储架构定义语言文件[.ssdl])。这三者结合在一起,就是EDM模式。EDM模式在项目中的表现形式就是扩展名为.edmx的文件。这个包含EDM的文件可以使用vs中的EDM设计器来设计,由于这个文件本事就是XML文件,可以手工编辑此文件来自定义csdl、msl与ssdl这三部分。
EDM——CSDL
CSDL定义了EDM或者说是整个程序的灵魂部分——概念模型。概念模型可以理解为实体类。实体类是面向对象设计中一个最根本的组成部分,其提前了显示世界中对象作为一种计算中可以表示的对象设计方法。而EDM的CSDL就是要达到这样一个目的。简单说,就是通过实体,达到一种数据转存或存储或更新,从而进行计算。
代码结构:Schema是CSDL的根元素,其中定义的Namespace是用于ObjectContext与EntityClass的命名空间,Alias-别名为此命名空间Namespace指定一个易记的名称,在定义Alias之后,在此Schema内的Element均可以该Alias作为Namespace的别名。(代码示例如下)
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="newssystemModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2008" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns:customannotation="http://schemas.microsoft.com/ado/2013/11/edm/customannotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityType Name="category">
<Key>
<PropertyRef Name="id" />
</Key>
<Property Name="id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="name" Type="varchar" MaxLength="200" Nullable="false" />
</EntityType>
<span style="white-space:pre"> </span><!--省略N个EntityType和Association-->
<Association Name="FK_news_category">
<End Role="category" Type="Self.category" Multiplicity="0..1" />
<End Role="news" Type="Self.news" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="category">
<PropertyRef Name="id" />
</Principal>
<Dependent Role="news">
<PropertyRef Name="caId" />
</Dependent>
</ReferentialConstraint>
</Association>
<EntityContainer Name="newssystemModelStoreContainer">
<EntitySet Name="category" EntityType="Self.category" Schema="dbo" store:Type="Tables" />
<EntitySet Name="comment" EntityType="Self.comment" Schema="dbo" store:Type="Tables" />
<EntitySet Name="news" EntityType="Self.news" Schema="dbo" store:Type="Tables" />
<EntitySet Name="sysdiagrams" EntityType="Self.sysdiagrams" Schema="dbo" store:Type="Tables" />
<AssociationSet Name="FK_comment_news" Association="Self.FK_comment_news">
<End Role="news" EntitySet="news" />
<End Role="comment" EntitySet="comment" />
</AssociationSet>
<AssociationSet Name="FK_news_category" Association="Self.FK_news_category">
<End Role="category" EntitySet="category" />
<End Role="news" EntitySet="news" />
</AssociationSet>
</EntityContainer>
</Schema>
</edmx:StorageModels>
EDM——SSDL
这个文件描述了表、列、关系、主键及索引等数据库中存在的概念。SSDL的代码结构与CSDL相似。
EDM——MSL
这个文件及上面所述的CSDL和SSDL的对应,主要包括CSDL中属性与SSDL中列的对应。MSL的根节点为Mapping,其中可以包含多个EntityContainerMapping(可以只有一个),每一个EntityContainerMapping对应着两个分别来自CSDL与SSDL的EntityContainer。这个EntityContainerMapping就是描述这两个EntityContainer间的对应。下面再给出一段代码展示EntityContainerMapping的基本格式。
EF实例
例子如下 , 操作数据库 实现增删改查
static void Main(string[] args)
{
//所有对数据库的操作第一就是创建数据访问 的上下文
newssystemEntities dbContext = new newssystemEntities(); #region 增加
///修改
category category = new category();
//category.id = 9;
category.name = "岁半"; //dbContext.Entry<category>(category).State = System.Data.EntityState.Modified;
dbContext.Entry<category>(category).State = EntityState.Added;
dbContext.SaveChanges();
#endregion #region 修改
///修改
category category = new category();
category.id = 30;
category.name = "新新闻"; dbContext.Entry<category>(category).State = System.Data.EntityState.Modified;
//dbContext.Entry<category>(category).State = EntityState.Added;
dbContext.SaveChanges();
#endregion #region 删除
///修改
category category = new category();
category.id = 30;
//category.name = "新新闻"; // dbContext.Entry<category>(category).State = System.Data.EntityState.Modified;
dbContext.Entry<category>(category).State = EntityState.Deleted ;
dbContext.SaveChanges();
#endregion #region 查询并修改
//查询出来实体:默认就是跟踪状态
var item = dbContext.category.FirstOrDefault();
item.name = "lirui";//只要改属性,那么就会自动将此实体的状态改为Modified dbContext.SaveChanges();
#endregion }
EF的优点和缺陷
优点:可以把实体类的定义有一个单独的项目使用C#class完成这样一种设计方式转变为使用xml文件定义并集成到数据访问层。以通过动态更改EDM的方法来增加实体并将其映射到数据库。便于修改数据库等等。
不足:Entity Framework技术的效率问题是其几乎唯一一个稍有不足之处。首先其将EntitySQL转换为SQL的方式属于解释性转换,性能较差。另外Entity Framework在每次应用启动时需要读取EDM,这个过程较慢(但在后续操作时,就不再存在这个问题)。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Entity Framework(实体框架 EF)的更多相关文章
- Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF
Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF Entity FrameWork的特点 1.支持多种数据库(MSSQL.Oracle.M ...
- Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)
在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...
- Entity Framework 实体框架的形成之旅--实体框架的开发的几个经验总结
在前阵子,我对实体框架进行了一定的研究,然后把整个学习的过程开了一个系列,以逐步深入的方式解读实体框架的相关技术,期间每每碰到一些新的问题需要潜入研究.本文继续前面的主题介绍,着重从整体性的来总结一下 ...
- Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)
本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...
- Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合
在使用Entity Framework 实体框架的时候,我们大多数时候操作的都是实体模型Entity,这个和数据库操作上下文结合,可以利用LINQ等各种方便手段,实现起来非常方便,一切看起来很美好.但 ...
- Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...
- Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- Entity Framework 实体框架的形成之旅--几种数据库操作的代码介绍(9)
本篇主要对常规数据操作的处理和实体框架的处理代码进行对比,以便更容易学习理解实体框架里面,对各种数据库处理技巧,本篇介绍几种数据库操作的代码,包括写入中间表操作.联合中间表获取对象集合.递归操作.设置 ...
- Entity Framework 实体框架的形成之旅--界面操作的几个典型的处理(8)
在上篇随笔<Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合>里面,介绍了在Entity Framework 实体框架里面引入了 ...
- Entity Framework 实体框架的形成之旅--Code First的框架设计(5)
在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好, ...
随机推荐
- JQuery 中三十一种选择器的应用
选择器(selector)是CSS中很重要的概念,所有HTML语言中的标记都是通过不同的CSS选择器进行控制的.用户只需要通过选择器对不同的HTML标签进行控制,并赋予各种样式声明,即可实现各种效果. ...
- HOMEWORK-2
没什么超乎常人的技能吧,我想.关于C的学习之前一直是自学,上了大学也是吃老底(上一篇提到了),因为这个学期一直在学matlab,C除了帮人写过作业教过课自己也没写点什么. 指针的概念还算清楚,毕竟经常 ...
- Docker 配置国内镜像拉取中心,Configure docker to use faster registries in China.
Networking in China is really bad when it comes to using some cloud based tools like docker, it's us ...
- TinyOS在ubuntu 14.04下安装教程
1:打开/etc/apt/sources.list 文件,在文件最底部添加安装源: deb http://tinyos.stanford.edu/tinyos/dists/ubuntu lucid m ...
- 安装Docker-ce
Docker Engine改为Docker CE(社区版) 它包含了CLI客户端.后台进程/服务以及API.用户像以前以同样的方式获取.Docker Data Center改为Docker EE(企业 ...
- GO-指针与函数
一.指针类型 1.普通类型,变量存的就是值,也叫值类型.指针类型存的是地址 2.获取变量的地址,用&,比如:var a int, 获取a的地址 &a 3.指针类型,变量存的是一个地址, ...
- 78.PL和PS通过BRAM交互共享数据
本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将结果 ...
- git命令大全【转】
转自:http://www.jqhtml.com/8235.html 初始化本地git仓库(创建新仓库) git init 配置用户名 git config --global user.name &q ...
- C# 获取mp3文件的歌曲时间长度
添加命名空间: using Shell32; using System.Text.RegularExpressions;添加引用:COM组件的Microsoft Shell Control ...
- apache 各种配置
//apache 的网站配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf -->在编辑这个文件前需要去httpd.conf把这个文件的注释 ...