1.什么是EF

EF又称持久层框架:平时C#定义的变量是保存到内存中的,一断电就没有了。而持久的意思是数据保存到硬盘盘里(数据库的sql查询是在硬盘里进行的,所以速度很慢)。EF帮我们将一个对象保存到数据库中,框架为我们自动生成相应的Sql与,通过ADO.NET向数据库发送命令。

2.EF包含哪些内容

a.怎么创建一个EF文件:

在VS中,新建一个ADO.NET实体数据模型。它会为我们生成一个后缀为edmx的文件。EF为我们做了三件事:生成一个XML文件(t4模板通过该xml新生产实体类和上下文对象);创建一个实体类(包含要处理对象的信息),添加一个数据上下文(EF上下文,通过该对象可以把内存中的数据添加到数据库)

通过查看,edmx其实就是一个xml文件。它主要包含三部分:数据实体的信息,模型对象的信息,映射信息。还有一个edmx设计器(Designer)

数据实体(StorageModels)

它包含了数据库的信息(什么数据库,数据库版本,数据库提供程序),表的信息(表名,表的主键,表中各字段的信息,实体容器信息)

<edmx:StorageModels>
<Schema Namespace="MyDBModel.Store" Provider="System.Data.SqlClient" ProviderManifestToken="2012" Alias="Self" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
<EntityType Name="Users">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="Name" Type="nvarchar" MaxLength="50" />
<Property Name="Age" Type="int" />
</EntityType>
<EntityContainer Name="MyDBModelStoreContainer">
<EntitySet Name="Users" EntityType="Self.Users" Schema="dbo" store:Type="Tables" />
</EntityContainer>
</Schema>
</edmx:StorageModels>

模型对象(ConceptualModels)

它包含对象的信息(命名空间),主键(必须要设置),对象各属性的信息,对象容器

<edmx:ConceptualModels>
<Schema Namespace="MyDBModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2009/11/edm">
<EntityType Name="User">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="Name" Type="String" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Name="Age" Type="Int32" />
</EntityType>
<EntityContainer Name="MyDBEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="Users" EntityType="Self.User" />
</EntityContainer>
</Schema>
</edmx:ConceptualModels>

映射信息(Mappings)

包含表信息的映射,和表中各字段的映射

<edmx:Mappings>
<Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs">
<EntityContainerMapping StorageEntityContainer="MyDBModelStoreContainer" CdmEntityContainer="MyDBEntities">
<EntitySetMapping Name="Users">
<EntityTypeMapping TypeName="MyDBModel.User">
<MappingFragment StoreEntitySet="Users">
<ScalarProperty Name="Id" ColumnName="Id" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="Age" ColumnName="Age" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>

b.EF为我们复制了程序集

这里用复制是因为,引进的程序集本身不在原生Framework中,它类似一个第三方开发包,在你添加实体程序时,会把该程序集复制到你所在项目中的package文件夹中

#region 程序集 EntityFramework.dll, v6.0.0.0

// E:\ConsoleApplication1\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.dll

#endregion

3.EF中的延迟加载

先说下两个Where()方法

a.集合的Where():

从上图可以得到信息:

1.集合中的Where()方法是一个扩展方法

2.该扩展方法是对接口IEnumerable的扩展,方法返回的是一个bool类型

3.该方法在命名空间System.Linq下

b.上下文中的Where()方法

从上图中可以得到信息

1.上下文中的Where()有一个是对IQueryable的扩展

2.命名空间也是在System.Linq下

补充上面的Where()中的方法,设立断点,监视list1的数据类型,如下图

知道返回的类型是DBQuery

通过查看定义,知道了延迟加载是基于System.Linq.Queryable给 IQueryable添加了扩展方法;而延迟加载真正是通过DbQuery实现的。

c.为什么使用延迟加载

原因一:当前可能通过多个SQO(标准查询)方法来组合查询条件【context.User.Order().Where().Select()】,而每个都只是添加一个查询条件,无法确定本次查询条件是否已经结束。所以,没有办法在每个SQO方法的时候确定SQL语句是什么,只能返回一个包含了所有添加的天剑的DBQuery对象,当使用这个DBQuery对象的时候,才根据所欲条件生成相应的Sql语句,查询数据

原因二:针对于外键实体的延迟,对于外键属性而言。临时查询外键表 也叫延迟加载 用到了才去查,EF会用这个外键属性的时候才会去查对应的表,而不是一口气将外键全部查出来。

MyBlogEntities context=new MyBlogEntities();
//说明:表BlogArticlehe 和表BlogUser有个主外键关系
//查询文章表中IsDel为0的所有文章
//虽然有外键表,但是没用到外键表,就不去查
IQueryable<BlogArticle> existArticles = context.BlogArticles.Where(u => u.IsDel==false).Select(u => u);
//从这些文章中 获得第一个文章
BlogArticle blog01 = existArticles.FirstOrDefault();
//获得这篇文章的作者信息
//通过sql profiler知道,直到执行这句话的时候,才查询表BlogUser
//在ado.net中,会通过union直接将两张表联合起来查询,不管你需不需要外键表的数据
//知道用到外键实体的时候,才会去查询外键表
Console.WriteLine(blog01.BlogUser.LoginName);

延迟加载有个缺点:

//每次调用外键实体时,都会查询数据库(EF有小优化:相同的外键实体只查一次)
IQueryable<BlogArticle> allArticles = context.BlogArticles.Select(u => u);
foreach (BlogArticle article in allArticles)
{
//每次调用article.BlogUser.LoginName都会生成去查询数据库中的数据
Console.WriteLine("文章名:"+article.Title+",文章作者:"+article.BlogUser.LoginName);
}

解决方法,使用Include将多个外键对象连接起来

//通过Include方法,设置EF生成sql语句,使用inner join把用户表对应的LoginName也查出来
//select * from BlogArticle b inner join Article a on b.Author=a.Id
IQueryable<BlogArticle> allArticles = context.BlogArticles.Include("BlogArticleCate").Include("BlogUser");
foreach (BlogArticle article in allArticles)
{
//一共就对数据进行了一次查询,将查询讲过保存到内存
Console.WriteLine("文章名:" + article.Title + ",文章作者:" + article.BlogUser.LoginName);
}

MVC的学习-EF的认识的更多相关文章

  1. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  2. 解析ASP.NET Mvc开发之EF延迟加载

    目录: 1)从明源动力到创新工场这一路走来 2)解析ASP.NET WebForm和Mvc开发的区别 3)解析ASP.NET Mvc开发之查询数据实例 ------------------------ ...

  3. MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)

    (最近使用内存分析工具ANTS Memory Profiler,以及其他网友提供的意见发现最终导致内存泄漏的就是MEF,在此特地更新下,与大家分享!最下面红色字体) 最近参考使用了郭明峰的一套架构来做 ...

  4. MVC中使用EF(2):实现基本的CRUD功能

    MVC中使用EF(2):实现基本的CRUD功能 By  Tom Dykstra |July 30, 2013 Translated by litdwg   Contoso University示例网站 ...

  5. ASP.NET MVC 5 学习教程:添加模型

    原文 ASP.NET MVC 5 学习教程:添加模型 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...

  6. MVC+UnitOfWork+Repository+EF

    MVC+UnitOfWork+Repository+EF UnitOfWork+Repository模式简介: 每次提交数据库都会打开一个连接,造成结果是:多个连接无法共用一个数据库级别的事务,也就无 ...

  7. ASP.NET MVC基础学习

    ASP.NET MVC基础学习 传统的MVC概念 模型:组类,描述了要处理的数据以及修改和操作数据的业务规则 视图:定义应用程序用户界面的显示方式 控制器:一组类,用来处理来自用户,整个应用程序流以及 ...

  8. 解析ASP.NET Mvc开发之EF延迟加载 分类: ASP.NET 2014-01-04 01:29 4017人阅读 评论(1) 收藏

    目录: 从明源动力到创新工场这一路走来 解析ASP.NET WebForm和Mvc开发的区别 解析ASP.NET 和Mvc开发之查询数据实例 ----------------------------- ...

  9. ASP.NET Core MVC 网站学习笔记

    ASP.NET Core MVC 网站学习笔记 魏刘宏 2020 年 2 月 17 日 最近因为” 新冠” 疫情在家办公,学习了 ASP.NET Core MVC 网站的一些知识,记录如下. 一.新建 ...

随机推荐

  1. hihocoder1496(高维前缀和)

    题意:给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 第一行一个整数N( ...

  2. java反射与注解结合使用(根据传入对象输出查询sql)

    我们在项目开发中有很多地方使用到了注解,关于注解的定义与创建小伙伴可以参考我的文章<java注解>.有任何问题的小伙伴们可以在评论区指出哦,欢迎各位大佬指出问题. 今天我要说的是使用注解与 ...

  3. tornado的http服务器实现

    使用tornado实现的一个简单http服务器:只需要定义自己的处理方法,其他的东西全部交给tornado完成. #coding:utf-8 import tornado.httpserver imp ...

  4. AutoCAD菜单加载失败 找不到文件mnc 怎么办

    菜单加载失败,找不到文件 SWFILECONV(mnu/mns/mnc)   找到CAD安装目录下的swfileconv.arx文件,用记事本打开,清空内容,然后保存即可.  

  5. yarn-cli 简介

    Yarn 提供了丰富的命令行命令来帮你应付你所开发的 Yarn 包的方方面面的工作,包括安装.管理.发布等等. 虽然我们在这里按照字母顺序列出了我们提供的所有命令,但是某些更常用的命令还是要着重提一下 ...

  6. [Android Studio] 取消引用库打包出现异常-- provided dependencies can only be jars

    Warning: Project App: provided dependencies can only be jars. com.android.support:appcompat-v7:22.2. ...

  7. Ubuntu18.04系统中vi键盘输入字符不匹配

    起因 今天重装了我的雷神笔记本的ubuntu18.04,不要问我为什么,我就是想复习下重装系统而已.好吧,我承认我改错文件启动不起来了. 于是我要重装jdk.maven and so on,但是当我用 ...

  8. Windows 驱动开发 - 7

    在<Windows 驱动开发 - 5>我们所说的读写操作在本篇实现. 在WDF中实现此功能主要为:EvtIoRead和EvtIoWrite. 首先,在EvtDeviceAdd设置以上两个回 ...

  9. JDK和TOMCAT的安装与配置环境变量

    一.JDK该怎么安装与配置环境变量 步骤1.安装JDK选择安装目录,安装jdk1.8.0_77过程中会出现安装提示. 步骤2.(1)安装jdk随意选择目录 只需把默认安装目录\java之前的目录修改即 ...

  10. Centos7 防火墙firewalld配置

    开启80端口 firewall-cmd --zone=public --add-port=80/tcp --permanent  出现success表明添加成功 移除某个端口 firewall-cmd ...