学懂C#编程:常用框架学习(三)——.NET Framework框架下的Entity Framework (EF)开发应用详解

        

目录

一、Entity Framework概述

二、Entity Framework的核心组成部分

Entity Data Model (EDM):

Entity Client:

Object Services:

ADO.NET Provider:

三、分层结构

应用程序层:

Entity Framework层:

数据库层:

四、EF 主要的功能包括

五、三种开发模式详解

1. 代码优先(Code First)

2. 数据库优先(Database First)

3. 模型优先(Model First)

六、总结


Entity Framework (EF) 是一个开源的对象关系映射 (ORM) 框架,它可以使 .NET 开发者能够使用 LINQ 查询关系型数据库,并且可以在 .NET 对象和数据库间转换数据。EF 提供了一种高级的抽象,让开发者不需要直接编写 SQL 查询和处理数据转换

        EF支持三种主要的开发模式:代码优先(Code First)、数据库优先(Database First)和模型优先(Model First)。下面将结合实际案例,详细讲解这三种模式,帮助初学者轻松理解和掌握。

一、Entity Framework概述

Entity Framework通过提供一组丰富的API和工具,使得数据访问层的开发变得更加简单和高效。它支持多种数据库系统,如SQL Server、MySQL、Oracle等,并允许开发人员使用LINQ(Language Integrated Query)来查询和操作数据。

二、Entity Framework的核心组成部分

  1. Entity Data Model (EDM)

    • 概念层(CSDL, Conceptual Schema Definition Language):定义了应用程序中的实体和它们之间的关系,这些实体对应于数据库中的表或视图。CSDL是EDM的“灵魂”部分,它用实体类表示数据库中的对象。
    • 存储层(SSDL, Store Schema Definition Language):描述了数据库的实际结构,包括表、列、关系、主键及索引等。SSDL将数据库中的对象信息加载到EF中,并描述数据库对象的结构信息。
    • 映射层(MSL, Mapping Specification Language):负责将概念层(CSDL)与存储层(SSDL)进行映射,确保应用程序中的实体能够正确地映射到数据库中的表或视图。

    这些部分通常以XML格式定义,并存储在.edmx文件中,该文件是EF实现ORM的关键配置文件。

  2. Entity Client

    • Entity Client是EF提供的一套类似于ADO.NET的数据库操作类,它主要用于操作EDM。与ADO.NET直接向数据库发送SQL命令不同,Entity Client是向EDM发送Entity SQL(EF特有的SQL方言),然后由EF将其转换为数据库可理解的SQL语句。
  3. Object Services

    • Object Services提供了丰富的API,允许开发人员以面向对象的方式操作数据。这些API隐藏了底层数据库操作的复杂性,使得开发人员可以更加专注于业务逻辑的实现。
  4. ADO.NET Provider

    • ADO.NET Provider是EF与数据库之间的桥梁,它负责将Entity Client的操作命令翻译为数据库的SQL语句,并执行这些语句。Microsoft默认实现了对SQL Server的ADO.NET Provider,但也可以通过其他数据库厂商提供的插件来支持其他数据库。

三、分层结构

从逻辑上讲,EF框架的分层结构可以归纳为以下几个层次:

  1. 应用程序层

    • 开发人员在这一层编写业务逻辑代码,通过EF提供的API来操作数据。这些API以面向对象的方式封装了数据库操作,使得开发人员可以像操作普通对象一样操作数据库中的数据。
  2. Entity Framework层

    • 这一层是EF框架的核心,它包含了EDM、Entity Client、Object Services等关键组成部分。EF层负责将应用程序层的请求转换为数据库可理解的SQL语句,并将执行结果返回给应用程序层。
  3. 数据库层

    • 数据库层是实际存储数据的地方,它可以是任何支持ADO.NET的关系型数据库。ADO.NET Provider负责将EF层生成的SQL语句发送到数据库层执行,并将执行结果返回给EF层。

四、EF 主要的功能包括

  • 通过 LINQ 查询数据
  • 跟踪对象的状态变化并将这些变化持久化到数据库
  • 支持事务处理
  • 支持数据库迁移,即可以根据模型变化自动更新数据库结构。

五、三种开发模式详解

1. 代码优先(Code First)

核心思想:先编写实体类和数据上下文(DbContext),然后根据这些代码生成数据库。

适用场景:适用于新项目,或对数据库结构有完全控制权的情况。

实际案例

假设我们要开发一个简单的博客系统,包含作者(Author)和文章(Post)两个实体。

1)定义实体类

public class Author  
{  public int AuthorId { get; set; }  public string Name { get; set; }  
}  public class Post  
{  public int PostId { get; set; }  public string Title { get; set; }  public string Content { get; set; }  public int AuthorId { get; set; }  public Author Author { get; set; }  
}

2)定义数据上下文

public class BlogContext : DbContext  
{  public DbSet<Author> Authors { get; set; }  public DbSet<Post> Posts { get; set; }  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)  {  optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=BlogDb;Trusted_Connection=True;");  }  
}

3)使用迁移生成数据库

在Visual Studio中,通过Package Manager Console运行以下命令:

Enable-Migrations  
Add-Migration InitialCreate  
Update-Database

这些命令会生成数据库迁移文件,并根据迁移文件创建数据库。 

2. 数据库优先(Database First)

核心思想:从现有数据库生成实体类和映射文件,然后在此基础上进行开发。

适用场景:适用于已有数据库的情况,如维护现有系统或集成第三方数据库。

实际案例

假设我们有一个现成的数据库,包含Authors和Posts两个表。

3. 模型优先(Model First)

核心思想:先设计数据模型,然后根据模型生成数据库。

适用场景:适用于从零开始设计数据模型的情况,或需要高度定制数据库结构的情况。

实际案例

 1)在Visual Studio中设计模型

          通过添加“ADO.NET Entity Data Model”项,选择“空模型”,并使用设计器添加实体和关系。   2)生成数据库脚本

           设计完成后,右键点击模型图,选择“生成数据库脚本”,将生成的SQL脚本在数据库中执行,以创建数据库和表。

3)使用生成的实体类进行数据操作

     与Database First类似,Model First也生成了实体类,可以直接在代码中使用。

  1. 使用Entity Framework Power Tools或dotnet ef工具生成模型

    在Visual Studio中,可以通过添加“ADO.NET Entity Data Model”项,并选择“从数据库生成模型”来生成实体类和映射文件。或者使用dotnet ef工具:

    dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=ExistingDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

  2. 这将根据数据库中的表生成相应的实体类和DbContext。

  3. 使用生成的实体类进行数据操作

    生成的实体类可以直接在代码中使用,进行CRUD操作。

六、总结

Entity Framework的三种开发模式各有优缺点和适用场景。Code First模式提供了最大的灵活性,适合新项目或对数据库结构有完全控制权的情况;Database First模式适用于已有数据库的情况,可以快速生成实体类和映射文件;Model First模式则适用于从零开始设计数据模型的情况。根据项目的具体需求选择合适的开发模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙语言基础类库:【@system.device (设备信息)】

设备信息 说明&#xff1a; 从API Version 6开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.deviceInfo]进行设备信息查询。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import dev…

linux操作fb文件节点刷纯色

代码 #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/mman.h> #include <stdlib.h> #include <string.h>#define RED 0xF800 #define YELLOW 0xFFE0 #define BLUE 0x0…

手把手教你,如何利用积木易搭3D扫描仪完成文物三维建模?

当前&#xff0c;文物三维建模主要技术手段主要有摄影测量技术、三维激光扫描技术、结构光扫描技术。其中&#xff0c;积木易搭的MagicScan作为一款先进的3D扫描仪&#xff0c;是正是运用了结构光扫描技术的精髓&#xff0c;它巧妙地融合了点云相机的高精度空间数据采集能力、纹…

如何用python写接口

如何用python写接口&#xff1f;具体步骤如下&#xff1a;  1、实例化server 2、装饰器下面的函数变为一个接口 3、启动服务 开发工具和流程&#xff1a; python库&#xff1a;flask 》实例化server&#xff1a;server flask.Flask(__name__) 》server.route(/index,met…

【STM32嵌入式系统设计与开发---拓展】——1_9 GPIO的输入和输出

这里写目录标题 0、输入 输出1、输出&#xff08;1&#xff09;GPIO_SetBits:用于设置 GPIO 引脚的状态&#xff08;即将指定的引脚设置为高电平&#xff09; 2、输入&#xff08;1&#xff09;GPIO_ReadInputDataBit&#xff08;&#xff09; 0、输入 输出 咋们定义了一个结构…

新手程序员如何判断自己的代码是高质量还是烂代码?

“五年工作经验&#xff0c;代码质量却不如三年程序员&#xff1f;” 这句话或许有些夸张&#xff0c;却也反映出代码质量参差不齐的现状。 那么&#xff0c;究竟什么是高质量的代码&#xff1f;如何才能写出让同行称赞、让机器流畅运行的代码呢&#xff1f; 今天我们就来聊…

服务器网络配置

后来呀&#xff0c;天亮之前毕业后踏入服务器领域了。。。。。。 服务器网络配置大体流程&#xff1a;硬件选择——系统安装——驱动调用——网卡配置 1、硬件选择 驱动程序是操作系统与硬件之间通信的桥梁 服务器硬件硬件选择首先看是否还有预留槽位&#xff0c;或者riser…

资产报废 BAPI_ASSET_RETIREMENT_POST

入参BUKRS公司代码ANLN1主资产号ANLN2资产子编号 BUDAT转资日期ANBTR已过账的金额BLDAT凭证中的凭证日期BZDAT资产价值日出参BUKRS公司代码ANLN1主资产号ANLN2资产子编号 BELNR会计凭证号码GJAHR会计年度ZBFJZ按本位币计的金额MSGTS消息类型TEXT消息文本 METHOD assets_retirem…

解决ESLint和Prettier冲突的问题

在配置了ESLint的项目中使用Prettier进行格式化可能会出现冲突&#xff0c;不如Prettier配置了使用双引号&#xff0c;ESLint配置了单引号&#xff0c;当然可以一个一个改成一样的配置&#xff0c;但是比较麻烦。我发现可以直接使用ESLint的规则进行格式化。在VSCode配置过程如…

xss复习总结及ctfshow做题总结xss

xss复习总结 知识点 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的…

软考从报考到拿到证书的过程

一、报考阶段及参加考试阶段 这个阶段可以留意软考官网的的信息&#xff0c;一般上半年是3月份报名、5月份考试&#xff1b;下半年是8月份报名、11月份考试。以下是这个阶段会用到的链接&#xff0c;保持关注就好。 软考官网&#xff1a;中国计算机技术职业资格网 (ruankao.o…

六、 SpringBoot 配置⽂件 ★ ✔【value的引号注意事项、@ConfigurationProperties 、】

六、 SpringBoot 配置⽂件 本节⽬标1. 配置⽂件作⽤2. 配置⽂件快速⼊⼿3. 配置⽂件的格式4. properties 配置⽂件说明4.1 properties 基本语法4.2 读取配置⽂件4.3 properties 缺点分析 5. yml 配置⽂件说明5.1 yml 基本语法5.2 yml 使⽤进阶5.2.1 yml 配置不同数据类型及 nul…

Git简要笔记

Git是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化并协调多人协作开发。它提供了一种管理和追踪代码变化的方式&#xff0c;以便团队成员可以同时进行工作&#xff0c;轻松地合并和管理他们的代码。 Git的基本概念包括&#xff1a; 仓库&#xff08;Repository&…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…

Vue实现滚动元素始终固定在最底部

1. 应用场景——聊天 在聊天的时候&#xff0c;展示聊天内容的元素是可以滚动的&#xff0c;通过上下滚动来查看过往消息。不过在首次打开聊天页面以及发送新消息时需要固定在滚动的最底部以及时展示最新的消息&#xff0c;这样才能获得比较好的用户体验。 效果&#xff1a; …

C++——类和对象(下)

文章目录 一、再探构造函数——初始化列表二、 类型转换三、static成员静态成员变量静态成员函数 四、 友元友元函数友元类 五、内部类六、匿名对象 一、再探构造函数——初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函…

【C语言】移位操作详解 - 《凌波微步 ! 》

目录 C语言移位操作 (Bitwise Shift Operators) 详解1. 移位操作符概述1.1 左移操作符 (<<)1.2 右移操作符 (>>) 2. 使用示例2.1 左移操作符示例2.2 右移操作符示例2.3 有符号和无符号右移 3. 注意事项3.1 超出位数范围的移位3.2 移位操作的性能 4. 移位操作的应用…

PostgreSQL使用(二)

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

【后端开发实习】用Redis实现消息队列邮件发送

简介 用Resi本身封装的方法相比于调redis-smq库&#xff0c;实现方式就要简单朴素很多&#xff1a; 调用redis本身的List数据结构的Lpush实现消息的进队。用Redis的List数据结构的brpop方法实现消息的出队。将出队消息通过邮件方法发送给指定的用户。 生动形象理解就是用redi…

《javeEE篇》--多线程(1)

进程 在讲线程之前我们先来简单了解一下进程 什么是进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;又或者说&#xff0c;可以把进程看作程序的一次运行过程(通俗的讲就是跑起来的程序)。 而且在操作系统内部&#xff0c;进程是资源分配的基本单位 PCB P…