EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过同一个context上下文,因此在线场景中的持久化十分简单. 这种方案适用于连接本地数据库或同一网络上的数据库. 优点: 执行速度快.上下文跟踪所有实体,并在实体发生更改时自动设置适当的状态. 缺点: 上下文保持在线状态,因此与数据库的连接保持打开状态.利用更多资源. 2.离线场景 离线场景中,使用…
1.DbContext(上下文类) 在DbFirst模式中,我们添加一个EDM(Entity Data Model)后会自动生成一个.edmx文件,这个文件中包含一个继承DbContext类的上下文实例,DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用: 1.DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >). 2.DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库.…
这一节将总结EF是怎么管理实体之间的关系.EF与数据库一样支持三种关系类型:①一对一 ,②一对多,③多对多. 下边是一个SchoolDB数据库的实体数据模型,图中包含所有的实体和各个实体间的关系.通过设计器我们很容易看出实体间的对应关系 1.一对一 如上图,Student和StudentAddress具有一对一的关系(零或一).一个学生只能有一个或零个地址.实体框架将Student实体导航属性添加到StudentAddress实体中,将StudentAddress实体导航属性添加到Student…
EF中的高并发 这里只介绍EF6中database-first开发方案的高并发解决方案,code-first开发方案中的高并发会在以后的EF CodeFirst系列中介绍. EF默认支持乐观并发:我们从数据库加载了一条数据,这是有人修改了这条数据,而我们手中用的还是旧数据,这就出现了脏读,这个时候我们修改了这条数据然后执行SaveChange()会发生什么呢?EF在保存数据时会首先查看数据库中的数据有没有改变过,数据没有改变就执行保存:数据改变了会抛出异常,我们再次提交前必须解决冲突(提到解决冲…
EF中使用事务 这节介绍EF6中事务的使用.EF core中事务的使用方式和EF6中一模一样. 1.EF中的默认的事务 默认情况下,当我们执行一个SaveChanges()方法时就会新建了一个事务,然后将context中的CUD操作都在这个事务中进行.Context中有多个SaveChanges()时,每一个SaveChanges()都会执行一个单独的事务.一个栗子: using (var context = new SchoolContext()) { context.Database.Log…
这里主要介绍两种查询方法 Linq to entity(L2E)和Sql 1.L2E查询 L2E查询时可以使用linq query语法,或者lambda表达式,默认返回的类型是IQueryable,(linq查询默认返回的是IEnumerable),下边给出了一个简单的例子 //查询名字为ls的用户集合 //query语法 var users = from u in context.UserInfo where u.UserName == "ls" select u; //method…
EF工作流程 1.EF基本CRUD流程 下边的图就可以很清晰地展示EF的CRUD操作的基本工作流程: 这里做一个EF CRUD操作的简单总结:1.定义模型:这是EF工作的前提,定义模型包括定义领域类(Domain Classes),派生自DbContext的上下文类和Configuration(如果有的话).EF将通过模型来执行CRUD操作.2.添加数据:将领域对象添加到上下文并调用SaveChanges()方法.EF API将构建适当的INSERT命令并将其执行到数据库.3.读取数据:执行LI…
在线场景中保存数据 在线场景中保存实体数据是一项相当容易的任务,因为使用的是同一个context,这个context会自动跟踪所有实体发生的更改. 下图说明了在线场景中的CUD(创建,更新,删除)操作. EF在调用context.SaveChange方法时,根据EntityState进行添加.修改或删除实体实例,并执行INSERT,UPDATE和DELETE语句.在线场景中,context跟踪所有实体的实例,EntityState无论何时创建,修改或删除实体,它都会自动为每个实体设置适当的实例.…
EF6中的异步查询和异步保存 在.NET4.5中介绍了异步操作,异步操作在EF中也很有用,在EF6中我们可以使用DbContext的实例进行异步查询和异步保存. 1.异步查询 下边是一个通过L2E语法实现异步查询的栗子: private static async Task<Student> GetStudent() { Student student = null; using (var context = new SchoolDBEntities()) { Console.WriteLine…
EF6添加了批量添加/删除实体集合的方法,我们可以使用DbSet.AddRange()方法将实体集合添加到上下文,同时实体集合中的每一个实体的状态都标记为Added,在执行SaveChange()方法时为每个实体执行Insert操作:同样的我们使用DbSet.RemoveRange()方法将集合中的所有实体都标记为deleted状态,在执行SaveChange()方法时为每一条数据执行delete操作. 通过AddRange()和RemoveRange()方法可以有效提升性能,所以建议在进行批量…
EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法.我们可以根据喜好来选择使用哪种配置方法,当同时使用代码和配置文件进行配置时,最终使用的是配置文件中的配置(配置文件比代码配置的优先级更高). 1.代码配置步骤 下边看一个代码配置的栗子,首先我们要新建一个集成DbConfiguration的类 public class FE6CodeConfig : DbCo…
什么是Entity Framework 学习EF的前提:熟练使用Linq和Ado.net,因为在使用EF框架进行开发时,我们大多数情况使用Linq进行查询和操作,而EF的底层实现用的是Ado.net. 1.EF的概念 在.NET3.5之前,我们经常编写ADO.NET代码或企业数据访问块来保存或检索底层数据库中的数据.做法是:打开过一个数据库的连接,创建一个DataSet来获取或提交数据到数据库,通过将DataSet中的数据和.NET对象相互转换来满足业务需求.这是一个麻烦且容易出错的过程.Mic…
本文主要的目的是 1. 说明Entity Framework Power Tools如何使用. 2. Entity Framework  快速门 实验环境: OS: Windows Server 2012, Windows 7 DE: VS2013 + MVC 6.0+Entity Framework+ SQL Server 2012 准备工作 基于现有数据库生成POCO数据类和数据库上下文需要借助Visual Studio一个扩展插件-- Entity Framework Power Tool…
下图为一个已经创建好的数据库表关系 实体数据模型的创建过程 在Visual Studio项目中,右键程序集菜单,选择[添加]->[新建项],在[添加新项窗口]中选择[ADO.NET实体数据模型],如下图 在[实体数据模型向导]窗口中选择[来自数据库的EF设计器] 然后选择数据库连接,如果没有的话,可以点击新建一个连接 然后选择数据库对象 现在a School.edmx文件被添加到了项目中,在这个文件中包含了school_schema数据库中表的实体类 创建实体数据模型时自动生成的配置文件 <?…
1.预先加载 预先加载:在对一种类型的实体进行查询时,将相关的实体作为查询的一部分一起加载.预先加载可以使用Include()方法实现. 1.加载一个相关实体类型 栗子:使用Include()方法从数据库中获取所有学生及成绩级别.导航属性实现预先加载: using (var ctx = new SchoolDBEntities()) { var stud1 = ctx.Students .Include("Standard") .Where(s => s.StudentName…
附加离线实体图集到上下文 这节主要内容是通过不同的方法将离线实体附加到上下文中. 在离线场景中,保存一个实体要略微困难一些.当我们保存一个离线的实体图集或一个单独的离线实体时,我们需要做两件事.首先,我们要把实体附加到新的上下文中,让上下文了知道存在这些实体.其次,我们需要手动设置每个实体的EntityState,因为新的上下文不知道这些离线实体都经过了些什么操作,所以新的上下文不能自动地给实体添加EntityState. 下图说明了此过程. 为了将离线实体附加到上下文,并为实体图中的每个实体设…
离线场景保存和删除实体/实体图集 这一节的内容是在离线场景中保存实体和实体图集 在离线场景中,当我们保存一个离线的实体图集或一个单独的离线实体时,我们需要做两件事.首先,我们要把实体附加到新的上下文中,让上下文了知道存在这些实体.其次,我们需要手动设置每个实体的EntityState,因为新的上下文不知道这些离线实体都经过了些什么操作,所以新的上下文不能自动地给实体添加EntityState.上一节我们清楚了附加离线图集的方法,附加离线图集时默认添加的EntityState不一定合适,所以我们就…
EF6中DbFirst模式下使用存储过程 我们已经知道EF可以将L2E或Entity SQL的查询语句自动转换成SQL命令,也可以根据实体的状态自动生成Insert/update/delete的Sql命令.这节介绍EF中使用预先定义的存储过程对一张或者多种表进行CURD操作. EF API会新建一个function来映射数据库中的自定义函数或存储过程.下边讲解EF DbFirst模式下存储过程的用法,EF CodeFirst存储过程的用法会在以后的EF CodeFirst系列中介绍. 1.DbF…
这一节介绍DbContext追踪实体的变化.EF支持DbContext在其生命周期中自动追踪加载的实体.我们可以通过DbChangeTracker类获取DbContext追踪的所有实体的变化. 注意每个实体必须有主键值才能被上下文追踪.概念模型中的实例如果没有主键值,DbContext不会对其执行追踪. 下边的代码显示了DbContext追踪实体状态变化过程 static void Main(string[] args) { using (var ctx = new SchoolDBEntiti…
EF DbFirst模式中的枚举类型使用 这一节介绍EF DbFirst模式中的Enum(枚举类型),CodeFirst模式中的Enum会在以后的EF CoreFirst系列中介绍.EF5中添加了对Enum的支持.现在Enum支持的数据类型有:Int16,int32,int63,byte,sbyte. EF中Enum的使用有两种: ① 通过EDM设计器将实体中的某一属性转换为枚举类型 ② 使用已存在的枚举 1.通过EDM设计器将实体中的某一属性转换为枚举类型 一个栗子: 我们将把Teacher表…
记录和拦截数据库命令 这一节介绍EF6怎么记录和拦截发送给数据库的查询和操作命令. 1.记录EF发送给数据库命令(DbContext.Database.Log) 以前给了查看EF发送给数据库的命令我们需要借助数据库的追踪工具或者第三方追踪工具,现在EF6中提供了DbContext.Database.Log属性(Action<string>类型),使用这个属性我们可以很方便地记录EF发送给数据库的命令. 下边是一个栗子: static void Main(string[] args) { usi…
Entity Framework支持的查询方式有三种 LINQ to Entities Entity SQL Native SQL [LINQ to Entities] LINQ(语言集成查询)是从Visual Studio 2008开始引入的功能,在C#中可以使用LINQ查询不同的数据源.LINQ-to-Entities在entity framework上的操作,可以访问底层数据库中 的数据.以下是LINQ查询语法示例: public course FindWith(int id) { usi…
Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. 微软官方对Entity Framework的定义: The Microsoft ADO.NET Entity Framework is an Object/Relational Mapping (ORM) framework that enables developers to work with…
由于System.Data.OracleClient.dll从.NET Framework4.0之后已被弃用,所以我们无法在.NET Framework高版本中使用.一番搜索之后,发现好多文章提到.NET连接Oracle需要安装客户端,安装驱动,各种配置...感觉无比麻烦. Oracle Entity Framework使用基本配置 Oracle官方推出了对于.NET的支持[Oracle Data Provider for .NET],根据我的Visual Studio下载了一个对应版本的组件,…
[环境安装] 可以通过NuGet直接搜索安装SQLite需要用到的组件 或者直接使用程序包管理器控制台 > Install-Package System.Data.SQLite 通过ADO.NET实体数据模型访问SQLite数据源之前,你需要安装 sqlite-netFx46-setup-bundle-x86-2015-1.0.105.2.exe,当然这个需要根据你使用的.NET Framework版本对应 下载地址:https://system.data.sqlite.org/index.ht…
使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是上下文实例,读写都通过一个context. 这种方案适用于连接本地数据库或同一网络上的数据库. 优点: 执行速度快.上下文跟踪所有实体,并在实体发生更改时自动设置适当的状态. 缺点: 上下文必须保持在线状态,因此与数据库的连接也要一直保持打开状态.消耗更多资源. 2.离线场景 离线场景中,使用不同上下文实例进行检索和保存.一个context检索实体后被释放,创建一个新的实体进行保存工…
翻译自http://www.entityframeworktutorial.net/,使用EF几年时间了,一直没有系统总结过,所以翻译这一系统文章作为总结,由于英语功底有限,翻译的可能有些问题,欢迎指正. 一.EntityFramewoke入门教程系列 Entity Framework入门教程(1)---Entity Framework简介 Entity Framework入门教程(2)---EF工作流程 Entity Framework入门教程(3)---EF中的上下文简介 Entity Fr…
这是我在Cnblogs上的第一个系列,但愿能坚持下去: 惯例索引 Entity Framework入门系列(1)-开篇兼索引: Entity Framework入门系列(2)-初试Code First: Entity Framework入门系列(3)-EF Power Tools尝鲜: Entity Framework入门系列(4)-EF支持MySQL: Entity Framework入门系列(5)-ADO.NET实体数据模型: Entity Framework入门系列(6)-T4模版使用:…
实体框架(Entity Framework)简介 简称EF 与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,最新版本是EF7[CodeOnly功能得到了更好的支持] 实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术.是微软的一个ORM框架. 什么是O/R Mapping 广义上,ORM…
ORM作为一种数据库訪问机制已广泛地应用于各种项目其中,在.Net开发中,应用比較广泛的ORM框架大致有以下几个: 官方支持的有:Linq to SQL.Entity Framework.三方的有:NHibernate.前面介绍过Linq to SQL的应用,这篇介绍一下Entity Framework在Asp.Net MVC4中的应用. 首先用Visual Studio(2012或2013,其他版本号须要安装Asp.Net MVC4)创建一个Asp.Net MVC4的项目,项目创建完毕后会发现…