什么是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)的更多相关文章

  1. Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF

    Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF Entity FrameWork的特点 1.支持多种数据库(MSSQL.Oracle.M ...

  2. Entity Framework 实体框架的形成之旅--实体数据模型 (EDM)的处理(4)

    在前面几篇关于Entity Framework 实体框架的介绍里面,已经逐步对整个框架进行了一步步的演化,以期达到统一.高效.可重用性等目的,本文继续探讨基于泛型的仓储模式实体框架方面的改进优化,使我 ...

  3. Entity Framework 实体框架的形成之旅--实体框架的开发的几个经验总结

    在前阵子,我对实体框架进行了一定的研究,然后把整个学习的过程开了一个系列,以逐步深入的方式解读实体框架的相关技术,期间每每碰到一些新的问题需要潜入研究.本文继续前面的主题介绍,着重从整体性的来总结一下 ...

  4. Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)

    本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...

  5. Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合

    在使用Entity Framework 实体框架的时候,我们大多数时候操作的都是实体模型Entity,这个和数据库操作上下文结合,可以利用LINQ等各种方便手段,实现起来非常方便,一切看起来很美好.但 ...

  6. Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)

    在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...

  7. Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  8. Entity Framework 实体框架的形成之旅--几种数据库操作的代码介绍(9)

    本篇主要对常规数据操作的处理和实体框架的处理代码进行对比,以便更容易学习理解实体框架里面,对各种数据库处理技巧,本篇介绍几种数据库操作的代码,包括写入中间表操作.联合中间表获取对象集合.递归操作.设置 ...

  9. Entity Framework 实体框架的形成之旅--界面操作的几个典型的处理(8)

    在上篇随笔<Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合>里面,介绍了在Entity Framework 实体框架里面引入了 ...

  10. Entity Framework 实体框架的形成之旅--Code First的框架设计(5)

    在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好, ...

随机推荐

  1. [译]Quartz.Net 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails

    第三课 更多关于Jobs和JobDetails 在这二课我们已经学习到,Jobs接口非常容易实现,只有一个execute方法.我们需要再学习一些知识去理解jobs的本质,Job接口的execute方法 ...

  2. ASP.NET 3.5控件和组件开发技术之客户端回发/回调揭密

    本文摘录自<纵向切入ASP.NET 3.5控件和组件开发技术>. 对于服务端控件元素,比如ASP.NET的Button标准服务端控件在提交时可以自动把请求发送到服务端处理,这样的控件我们不 ...

  3. Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

  4. antdVG6随记

    g6是一个很棒的可视化工具 目前支持开发者搭建属于自己的图,图分析.图应用.图编辑器 图编辑器可以支持多种图例的创建 G6 是一个简单.易用.完备的图可视化引擎,它在高定制能力的基础上,提供了一系列设 ...

  5. 向量与矩阵的范数及其在matlab中的用法(norm)

    一.常数向量范数 \(L_0\) 范数 \(\Vert x \Vert _0\overset{def}=\)向量中非零元素的个数 其在matlab中的用法: sum( x(:) ~= 0 ) \(L_ ...

  6. docker-It's possible that too few managers are online. Make sure more than half of the managers are online.

    问题:docker ---- It's possible that too few managers are online. Make sure more than half of the manag ...

  7. Hash破解神器:Hashcat的简单使用

    Hash破解神器:Hashcat的简单使用 2014-06-10 21:02:42|  分类: 离线密码破解 |  标签:密码字典  rar密码破解  zip密码破解  密码破解  |举报|字号 订阅 ...

  8. php webshell常见函数

    0x1 直接在字符串变量后面加括号, 会调用这个函数: <?php $s = 'system'; $e = 'assert'; $s('whoami'); $e('phpinfo();'); 0 ...

  9. 健身VS不健身,完全是两种不同的人生!

    这两天一组同龄人合照 刷爆了国内健身圈, 图左是一位67岁的老人, 图右是67岁的健美运动员杨新民老师 相同年龄, 但从外观上有着强烈的距离感! 让多人不禁感叹,健身和不健身, 简直就是两种状态,两种 ...

  10. 004ICMP-type对应表

    一次在某个防火墙配置策略里看到如下的代码: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A FORWARD -p icmp ...