什么是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,这个过程较慢(但在后续操作时,就不再存在这个问题)。
分享到:
相关推荐
实体框架Ado.Net Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。在EF中,提出使用概念模型建模,直接针对关系型数据库的物理模型的建模的架构。
ef6类库,entity framework6 实体框架
EntityFrameworkCore演示文件,Demo基于.Net Core 2.2实现,1-5分别为: 1-与SqlServer数据库连接并通过ORM创建实体关系映射 2-常见的1:N,N:N,1:1关系 3,4-CRUD 5-种子数据填充。 根据微软MVP大佬杨旭老师...
Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象;跟踪对象所做的更改;并发处理;将对象更改传播到数据源等。今天我们就一起讨论如何利用Entity ...
EF,实体框架的核心是实体数据模型。实体框架在查询数据库,或根据数据创建对象,然后把修改持久化回数据库时,都会使用这个概念模型。
实体框架6 实体框架6(EF6)是一种对象关系映射器,它使.NET开发人员可以使用特定于域的对象来处理关系数据。 它消除了开发人员通常需要编写的大多数数据访问代码。 Entity Framework 6是由Entity Framework团队与...
EF实体框架有3种类型,Data First、Model First、Code First。Code First是最简单用的最多的一种
实体框架是 ADO.NET 中的一套支持开发面向数据的软件应用程序的技术。面向数据的应用程序的架构师和开发人员曾为实现两个迥然不同的目标费尽心机:他们必须为要解决的业务问题的实体、关系和逻辑构建模型,还必须...
PM> Install-Package Z.EntityFramework.Plus.EFCore Z.EntityFramework.Plus.EF6 PM> Install-Package Z.EntityFramework.Plus.EF6 Z.EntityFramework.Plus.EF5 PM> Install-Package Z.EntityFramework.Plus....
本文介绍了一个免费的、类似 AutoMapper 的库,可帮助.NET开发人员轻松地在实体框架核心和DTO的实体POCO之间映射属性。
第1部分 开始使用实体框架之历史和框架简述 第2部分 开始使用实体框架之使用介绍 第3部分 实体数据建模基础之创建一个简单的模型 第4部分 实体数据建模基础之从已存在的数据库创建模型 第5部分 实体数据建模基础之有...
Pomelo.EntityFrameworkCore.MySql ...兼容性依存关系以下版本的MySqlConnector,EF Core和.NET Standard与Pomelo.EntityFrameworkCore.MySql兼容: 释放科MySqlConnector EF核心.NET标准.NET(核心) .NET Framework>
EntityFramework.MoqHelper是一个简单的库,但是在使用实体框架进行模拟时有很多帮助。 要通过模拟创建对象,它需要执行许多设置,尤其是对于进行查询的测试方案。 这些所需的许多代码都封装在该库中,并创建了...
实体框架介绍EntityFramework扩展软件包发行说明套件版本对于EF Core 2.x,请使用1.4.x及以下版本对于EF Core 3.x,请使用上方1.5.0和下方2.0.0 对于EF Core 5.x,请使用2.0.0及更高版本有关更多软件包版本的详细...
EF 5.0 您将能够使用此方法在查询结果发生更改时通知应用程序,而不必不断轮询数据库。在这过程中,我们将学习一些关于反射的概念,以及一些关于实体框架内部的概念。
# # Z.EntityFrameworkExtensions 是 .NET 实体框架扩展库的演示版本。 使用BulkSaveChanges和数百个其他功能进行创新,这些功能将大大提高您的性能。支持其他产品[.NET 编译器] ( ) [SQL.NET] ( )
创建了一个使用实体框架和SQL Server Express LocalDB来存储和显示数据的简单Web应用程序. 实现了基本的CRUD和排序、筛选、分页及分组功能. using System; using System.Collections.Generic; using System.Data; ...
实体框架核心的文档数据库提供者 欢迎来到EntityFrameworkCore的文档数据库(NoSQL)提供程序之家! 该存储库当前仅包含EF Core的MongoDB提供程序。 但是,当前路线图中已计划通过进一步的NoSQL提供程序产品来扩展...
实体框架(EF)Core Cacheable是用于流行的实体框架数据访问技术的扩展库。 它为所有类型的查询结果提供缓存功能。 基于表达式树和参数,上下文决定执行对数据库的查询或从内存返回结果。 缓存如何影响性能 这...
可以轻松应用于任何基于EntityFrameworkCore的实体框架数据库。 注意:该项目仅适用于单体项目,不适用于分布式应用,分布式应用请考虑使用大型的搜索引擎中间件做支撑,如:ElasticSearch | 项目开发模式:日常...