【EF框架】聊一聊EF框架

article/2025/11/8 1:46:54

前言

   EF框架的全称EntityFramework ,Entity Framework是ADO.NET 中的一套支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。

叙述

ORM

   ORM是一种将数据从域对象存储到关系数据库(如MS SQL Server)的工具,以自动化的方式,无需太多编程。O / RM包括三个主要部分:域类对象,关系数据库对象和有关域对象如何映射到关系数据库对象(表,视图和存储过程)的映射信息。ORM允许我们将我们的数据库设计与我们的域类设计分开。这使得应用程序可以维护和扩展。它还自动执行标准的CRUD操作(创建,读取,更新和删除),以便开发人员不需要手动编写。

 

EF框架

    EF框架是一个对象/关系映射(O/RM)框架。这是ADO.NET的一个增强,它为开发人员提供了访问和存储数据库数据的自动化机制。

EF架构的组件

   我们来看一下EF框架的整体架构,看一下EF架构都有哪些组件。

1、EDM(实体数据模型): EDM由三个主要部分组成 - 概念模型,映射和存储模型。
2、概念模型(Conceptual Model):概念模型包含模型类及其关系。这将独立于您的数据库表设计。
3、存储模型(Storage Model):存储模型是包含表,视图,存储过程及其关系和关键的数据库设计模型。
4、映射(Mapping):映射由有关概念模型如何映射到存储模型的信息组成。
5、LINQ to Entities: LINQ to Entities是一种用于针对对象模型编写查询的查询语言。它返回在概念模型中定义的实体。你可以在这里使用你的LINQ技能。
6、实体SQL(Entity SQL):实体SQL是另一种查询语言,就像LINQ to Entities一样。
7、对象服务(Object Service):对象服务是访问数据库中的数据并将其返回的主要入口点。对象服务负责实现,这是将从实体客户端数据提供者(下一层)返回的数据转换为实体对象结构的过程。
8、实体客户端数据提供者(Entity Client Data Provider):此层的主要职责是将L2E或实体SQL查询转换为底层数据库可以理解的SQL查询。它与ADO.Net数据提供者通信,而ADO.Net数据提供者又从数据库发送或检索数据。
9、ADO.Net数据提供程序(ADO.Net Data Provider):该层使用标准的ADO.Net与数据库进行通信。

EF加载方式

延迟加载

   延迟加载又叫惰性加载(Lazy Loading):即在需要或者使用的时候加载数据。默认情况下,EF会使用延迟加载方式加载数据。延迟加载意味着延迟加载相关数据,直到您明确请求为止。例如,Student类包含StudentAddress作为复杂属性。因此,上下文首先加载数据库中的所有学生,然后在我们访问StudentAddress属性时加载特定学生的地址,如下所示。

 

using (var ctx = new SchoolDBEntities()){//Loading students onlyIList<Student> studList = ctx.Students.ToList<Student>();Student std = studList[0];//延迟加载:用的时候加载StudentAddress add = std.StudentAddress;}

上面显示的代码将导致两个SQL查询。首先,它会获取所有的学生:

SELECT 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[StudentName] AS [StudentName], 
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]

然后,当我们获得StudentAddress的引用时,它将发送以下查询:

 

exec sp_executesql N'SELECT 
[Extent1].[StudentID] AS [StudentID], 
[Extent1].[Address1] AS [Address1], 
[Extent1].[Address2] AS [Address2], 
[Extent1].[City] AS [City], 
[Extent1].[State] AS [State]
FROM [dbo].[StudentAddress] AS [Extent1]
WHERE [Extent1].[StudentID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1

但是,您也可以关闭特定属性或整个上下文的延迟加载。要关闭特定属性的延迟加载,请不要使其变为虚拟。要关闭上下文中所有实体的延迟加载,请将其配置属性设置为false:

 

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;public partial class SchoolDBEntities : DbContext
{public SchoolDBEntities(): base("name=SchoolDBEntities"){this.Configuration.LazyLoadingEnabled = false;}protected override void OnModelCreating(DbModelBuilder modelBuilder){throw new UnintentionalCodeFirstException();}
}

延迟加载规则:
(1)context.Configuration.ProxyCreationEnabled应该是true。
(2)context.Configuration.LazyLoadingEnabled应该是true。
(3)导航属性应该定义为公共的,虚有的。如果属性没有被定义为虚有的,上下文将不会执行延迟加载。

显示加载

   显式加载亦可为贪婪加载,不同的是显式加载要手动关闭EF的延迟加载属性,通过代码ctx.Configu ration.LazyLoadingEnabled = false;来完成

 

using (var dbcontext= new ModelFirstDemoEntities())
{dbcontext.Configuration.LazyLoadingEnabled = false;#region 显式加载:查询部分列数据,前提关闭 懒加载//查询表中部分列的数据var items = from c in dbcontext.Customerselect c;foreach (var item in items){//条件判断,只加载满足条件的数据,减少访问数据库的次数if (item.Id < 5){dbcontext.Entry(item).Collection(c => c.Order).Load();Console.WriteLine(item.CusName);}foreach (var order in item.Order){Console.WriteLine("Course name : {0}", order.OrderContent);}}#endregion
}

预加载

  如果想让所有数据一次性全部加载到内存中,那么你需要使用.Include(Entity)方法。

 

using (var dbcontext=  new ModelFirstDemoEntities())
{#region 贪婪加载: 一次查询加载全部数据var q = from t in dbcontext.Customer.Include("Order")select t;foreach (var cus in q){Console.WriteLine("Teacher : {0}", cus.Id);Console.WriteLine("Respective Courses...");foreach (var order in cus.Order){Console.WriteLine("Course name : {0}", order.OrderContent);}Console.WriteLine();}#endregion
}

EF映射创建实体

点击打开链接

小结

在实际项目的开发中,EF框架与MVC架构的结合是很常见的一件事情,所以我们应该了解一下它们在项目开发中具体应该如何使用。

 


http://chatgpt.dhexx.cn/article/cCmV5InO.shtml

相关文章

给EF框架自动生成实体类修改名字

给EF框架自动生成实体类名字一般以T_ 开头&#xff0c;不符合我们给实体类起的名字这个时候如何进行修改呢&#xff1f; 右击2 选择属性 将属性中的实体集名称和名称改成自己想要的样子就可以啦~ 然后点击重新生成解决方案&#xff0c;我们就能修改自动生成的.cs的实体类名…

EF框架搭建

这是在vs2019版本社区版的创建流程&#xff1b; 右键项目添加新建项->选择数据&#xff0c; 这里选择第一个ADO.NET实体数据模型&#xff0c;并重命名&#xff0c;我这里命名为数据库名 基本上用的都是第一个&#xff0c;通过数据库生成实体类。 因为当前项目没有连接过&am…

EF框架如何搭建

EF出现背景 1、以前程序设计师一定要为了连接与访问数据库而去学习 SQL 指令&#xff0c;因此在信息业中有很多人都在研究如何将程序设计模型和数据库集成在一起&#xff0c;对象关系对应 (Object-Relational Mapping) 的技术就是由此而生。 2、像Hibernate或NHibernate都是这…

EF框架-SQL语句 查询与修改

机房合作当中使用到了框架首先有很多的不同之处&#xff0c;大大方便的编程的时间。 首先在查询与修改这两个点出发。 查询 这是使用SQL语句进行的查询&#xff0c;查询到的是多条信息 public List<CancelCardModel> SelectCancelRecord(string iD){using (InternetBa…

EF框架简介

EF 全称是 EntityFramework 。 Entity Framework是ADO.NET 中的一套支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。   ORM框架&#xff08;Object Relational Mapping&#xff09; 翻译过来就是对象关系映射。 二、EF实体框架整体架构&#xff1a; 架构组件&…

NET EF框架

EF 框架是微软的.NET中ORM&#xff08;对象关系映射&#xff09;框架。 在没有EF框架之前&#xff0c;我们是直接与ADO.Net 进行交互来访问数据库&#xff0c;在SqlHelper 里面面通过设置connection ,command ,dataset,datareader等来与数据库交互&#xff0c;这样的话使得我们…

EF框架的优点是什么?

Entity Framework 应用程序有以下优点&#xff1a; 1、应用程序可以通过更加以应用程序为中心的概念性模型(包括具有继承性、复杂成员和关系的类型)来工作。 2、应用程序不再对特定的数据引擎或存储架构具有硬编码依赖性。 3、可以在不更改应用程序代码的情况下更改概念性模…

EF框架,认识一下!

What&#xff1f; EF的全称是Entity Framework&#xff0c;也叫实体框架。是微软以ADO.Net为基础开发出来的对象关系映射&#xff08;ORM&#xff09;解决方案&#xff0c;它解决了对象持久化问题&#xff0c;将程序员从编写麻烦的SQL语句当中解放出来。就是用操作对象的方式来…

EF框架学习分享一

一、什么是EF框架和ORM框架 &#xff1f; EF 全称是 EntityFramework 。Entity Framework是ADO.NET 中的一套支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。 ORM框架&#xff08;Object Relational Mapping&#xff09; 翻译过来就是对象关系映射。 二、EF实体框…

EF框架

EF框架&#xff0c;全称Entity Framework&#xff0c;即实体框架 一、EF简介&#xff1a; 它微软提供的一种ORM工具&#xff0c;支持面向数据的软件应用程序的技术。ORM让开发人员节省数据库访问的代码时间&#xff0c;将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯…

微信小程序开发——上传图片

功能描述 1.拍摄或从手机相册中选择图片上传。 2.chooseImage(e) 中的index用于判断是新增图片还是替换图片。 3.delImage(e) 删除当前index索引下的数据。 wx.chooseMedia(Object object) 属性类型默认值必填说明countnumber9否最多可以选择的文件个数mediaTypeArray.<…

微信小程序图片下边加文字组合

图片下边加文字组合 简介 我们在开发程序的时候&#xff0c;很大情况会用到图片下边加文字的组合&#xff0c;因为好看又实用&#xff0c;所以在此记录一下给大家。 效果图 代码 wxml <view class"view_saoyisao"><image class"image_saoyisao&qu…

微信小程序剪切图片的功能

全平台&#xff08;Vue、React、微信小程序&#xff09;任意角度旋转 图片裁剪组件 | 微信开放社区 Simple-Crop/USAGE-wechat.md at master newbieYoung/Simple-Crop GitHub 首选下载下来wechat这个文件夹。放在小程序的components里面 把它放做一个组件来用啦.我把这个文件…

微信小程序 图片显示不出来的问题 100%管用

相信大多数微信小程序的开发者都会遇到的一个问题就是图片在模拟器上能显示 跑到真机上就不行&#xff0c;而且ios能显示安卓却显示不了的问题&#xff0c;这个问题也是困扰了我很久&#xff0c;最终想到了解决方案。 大多数情况下 都是后端返回一个url地址然后我们再拿基准…

微信小程序 背景图片设置

微信小程序设置背景图片时&#xff0c;有两种方法&#xff1a; 第一&#xff1a;直接在.wxss中中使用 “background-image:url()” 设置背景图片&#xff0c;但是这种加载背景图片的方法存在一个问题&#xff0c;就是所加载的图片只能是网络图片或base64图片&#xff0c;是不可…

微信小程序图片的垂直和水平居中,line-height无效,使用flew布局

微信小程序中&#xff0c;图片的完全居中显示&#xff0c;line-height并不能发挥效果&#xff0c; line-height可以时内部文字垂直居中显示&#xff0c;但是对于图片并未发挥效果 如图&#xff1a; 不过&#xff0c;水平居中显示&#xff0c;可以使用 text-align:center 解决方…

微信小程序 图片处理的几个样式

每天记录一点对自己来说的新内容。 1、外层包裹的view标签显示边框 示例&#xff1a; 样式&#xff1a; .viewborder {border: 3px solid #f1bb69;border-radius: 10rpx;padding: 10rpx;margin: 10px; } 2、图片边框阴影效果 示例&#xff1a; 样式&#xff1a; .icon {wi…

解决微信小程序图片上传点击无反应问题

解决微信小程序图片上传点击无反应问题 背景原因 背景 在微信小程序webView中使用mand-mobile或vant图片上传组件点击无反应&#xff0c;无法进行图片上传。 原因 微信小程序WebView中不支持input标签multiple属性&#xff0c;该属性是支持多文件上传属性&#xff0c;解决此…

微信小程序图片上传一直loading中,上传没反应

问题&#xff1a; 前端使用小程序自带的上传api,即wx.chooseImage和wx.uploadFile&#xff1b;直接上传到公司后端服务器里&#xff08;注不是上传到阿里云&#xff09;&#xff0c;问题是wx.chooseImage成功了&#xff0c;但是wx.uploadFile就是没有成功。 解决&#xff1a;…

uniapp开发微信小程序图片拉伸问题

今天开发微信小程序的时候&#xff0c;发现我的图片被拉伸了 如何解决图片拉伸的问题 在uniapp中的image中有一个mode属性&#xff0c;去设置就好了 注意 src 仅支持相对路径、绝对路径&#xff0c;支持 base64 码 mode的属性值有很多 我简单的给大家列出来几种 scaleToFi…