什么是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. JavaScript Promises 实现框架一览及对比

    In my previous post in Danish I looked at how to perform asynchronous calls by using promises. Now t ...

  2. nesC编程入门

    1.接口 NesC程序主要由各式组件(component)构成,组件和组件之间通过特定的接口(interface)互相沟通.一个接口内声明了提供相关服务的方法(C语言函数).例如数据读取接口(Read ...

  3. php-fpm性能优化

    PHP-fpm PHP-FPM是一个PHPFastCGI管理器,是只用于php的. php-fpm 已经在 Linux.MacOSX.Solaris 和 FreeBSD 上测试通过. 确信 libxm ...

  4. python开发规范(转载)

    转载自http://www.cnblogs.com/wangcp-2014/p/4838952.html 目录 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行 ...

  5. 64_s2

    sipwitch-1.9.15-3.fc26.x86_64.rpm 13-Feb-2017 09:19 162822 sipwitch-cgi-1.9.15-3.fc26.x86_64.rpm 13- ...

  6. elk系列4之kibana图形化操作【转】

    preface 我们都搭建了ELK系统,且日志也能够正常收集的时候,那么就配置下kibana.我们可以通过kibana配置柱状图,趋势图,统计图,圆饼图等等各类图.下面就拿配置统计图和柱状图为例,结合 ...

  7. ZebraDatepicker中文显示

    解决方法:①<script type="text/javascript" src="xx.js" charset="UTF-8"> ...

  8. 利用json模块解析dict报错找不到attribute 'dumps'[python2.7]

    [背景] 环境: RHEL 7.3 版本: python2.7 [错误情况] 写了一个简单的python脚本 将dict转换为json 脚本如下: #!/usr/bin/python #-*- cod ...

  9. C/C++——C语言常用库函数

    本文转载自:https://blog.csdn.net/qq_36955347/article/details/71511900 一.数学函数 调用数学函数时,要求在源文件中包下以下命令行: #inc ...

  10. 7. Docker Compose 项目