【Entity Framework】 EF三种开发模式

【Entity Framework】 EF三种开发模式

文章目录

  • 【Entity Framework】 EF三种开发模式
    • 一、概述
    • 二、DataBase First
      • 2.1 DataBase First简介
      • 2.2 DataBase First应用步骤
      • 2.3 DataBase First总结
    • 三、Model First
      • 3.1 Model First简介
      • 3.2 Model First实现步骤
    • 四、Code First
      • 4.1 Code First概述
      • 4.2 Code First实现步骤
      • 4.3 Code First的映射规则

在这里插入图片描述

一、概述

前面博文已介绍了Entity Framework是什么,EF架构等基本知识介绍。本文将从介绍Entity Framework使用的三种方式。

Entity Framework的底层其实是调用ADO.NET,它是更高层次的封装,作为数据访问的技术。Entity Framework设计的高扩展性,体现在灵活的映射定义。简单的说,使用Entity Framework可以充分定义与数据库表映射的实体,这个实体可以直接用于业务逻辑层或作为服务的数据契约。使用EF后,可以将实体类的设计工作完全放在EDM设计过程中,而不需要手工写哪些大同小异的代码,令人欣喜的是这个实体模型可以在运行时修改并生效,我们开发时也不用再频繁地与数据库打交道。只要通过操作实体模型就能完成对数据库的操作。

EF框架可以划分一下三种应用模式:

  • DataBase First
  • Model First
  • Code First

下面将详细介绍下面三种模式

二、DataBase First

DataBase First参考

2.1 DataBase First简介

Database First就是先建数据库或使用已有的数据库。然后再vs中添加ADO.Net实体数据模型,设置连接并且选择需要的数据库和表。它是以数据库设计为基础的,并根据数据库自动生成实体数据模型,从而驱动整个开发流程。除生成实体模型和自跟踪实现模型,还支持生成轻型DbContext。这种模式的好处是使用简单,容易上手。比较适合于采用已经存在的数据库进行开发。既通过简单的方式实现了,又重用了数据库。

2.2 DataBase First应用步骤

如果使用DataBase First模式,先创建好对应的数据库及表。

  1. 现在项目->添加新项->选择ADO.NET实体数据模型
  2. 打开启动实体数据模型向导,选择“从数据库生成”,并创建数据库连接字符串。
  3. 单击“表”旁边的复选框以导入所有表,然后单击“完成”

2.3 DataBase First总结

Database First开发,它允许我们基于现有数据库在EF设计器中创建模型。然后,我们使用该模型在数据库中读取和写入一些数据。

三、Model First

3.1 Model First简介

Model First 允许你使用实体框架设计器创建新模型,然后从该模型生成数据库架构。 模型存储在 EDMX 文件(.edmx 扩展名)中,可以在实体框架设计器中查看和编辑。 你在应用程序中与之交互的类是从 EDMX 文件自动生成的。

3.2 Model First实现步骤

  1. 使用 Visual Studio 中包含的实体框架设计器来创建模型
    • “项目” ->“添加新项…”
    • 从左侧菜单中选择“数据”,然后选择"ADO.NET实体数据模型"
    • 输入“xxxModel”名称并单击确定,这将启动实体数据模型向导
    • 选择“空模型”并单击“完成”
  2. 向模型添加实体、属性和关联
    • 右键单击设计图面并选择“属性”
    • 在“属性”窗口中,将“实体容器名称”更改为 xxxContext。这是将为你生成的派生上下文的名称,该上下文表示与数据库的会话,允许我们查询和保存数据
    • 右键单击设计图面并选择“添加新项”->“实体…”
    • 输入 Blog 作为实体名称,输入 BlogId 作为键名称,然后单击“确定”
    • 右键单击设计图面上的新实体并选择“添加新项”->“标量属性”,输入 Name 作为属性名称。
    • 重复此过程以添加 URL 属性。
    • 右键单击设计图面上的 URL 属性并选择“属性”,在“属性”窗口中将“可为 null” 设置更改为 True。这样,我们无需为 Blog 分配 URL 即可将其保存到数据库中
  3. 添加关联(或关系)
    • 右键单击设计图面并选择“添加新项”->“关联…”
    • 使关系的一端指向 Blog,多重性为“一”,另一端指向 Post,多重性为“多”。这意味着一个 Blog 有多个 Post,而一个 Post 属于一个 Blog
    • 确保选中“将外键属性添加到“Post”实体”框,然后单击“确定”

四、Code First

4.1 Code First概述

Code First模式我们称之为“代码优先”模式,从某种角度来看,其实“Code First”和“Model First”区别并不是太明显,只是它不借助于实体数据模型设计器,而是直接通过编码方式设计实体模型(这也是为什么最开始“Code First”被叫做“Code Only”的原因)。但是对于EF它的处理过程有所差别,例如我们使用Code First就不再需要EDM文件,所有的映射通过“数据注释”和“fluent API”进行映射和配置。

4.2 Code First实现步骤

  1. 添加类创建实体模型,并创建导航属性,设置实体模型之间关系。
  2. 安装Entity Framework包
    • 通过NuGet在线安装Entity Framework包
    • 使用"程序包管理器控制台"通过"Install-package EntityFramework"命令安装
  3. 创建dbContext上下文
    • 首先在配置文件中(app.config)中配置数据库链接字符串
    • 接下来创建dbContext类,此类继承System.Data.Entity.DbContext类,其构造函数调用了积累带参数的构造函数,用来读取配置文件中的数据库链接字符串。
  4. 对数据进行增删改查操作
    • 使用dbContext对象对数据库进行操作

4.3 Code First的映射规则

  1. 关于表和字段名的约定

    Code First约定表名使用实体类名的复数形式来命名表明,属性映射的列使用与类中属性一致的名字命名

  2. 关于主键的约定

    Code First默认规定将命名为Id或[类名]Id的属性是为类的主键,如果是int类型或GUID类型同时会设为标识列。

  3. 关于字符串属性的约定

    Code First将String类型属性映射为不限长度的非空列中。默认数据类型为nvarchar(max),且允许为空。

  4. 关于布尔属性的约定

    Code First将bool类型属性映射为bit类型,且不允许为空

  5. 关于外键的约定

    对于外键,如果在类中添加了引用类型,而这个引用类型也在Entity Framework的上下文中,EF会把这种属性成为导航属性。

    一旦EF在类中检索到导航属性,就会寻找对应的外键。EF会认为属性名+Id或者类名+Id可能就是外键属性,如果找到名称一致且类型与导航属性目标类的主键类型一致,则认为是外键。如果类型不一致,EF则会认为该类设置有误。

    如果没有找到符合要求的属性,EF会自己添加一个外键属性。另外,对于不同的关系也有一些不同的约定。

    • 一对一关系:要求导航属性双方都应该具有外键配置。
    • 一对多关系:要求多的一方设置外键。同时如果在一方这边设置了集合类型的导航属性,那么EF会自动到目标类中寻找外键属性。
    • 多对多关系:会生成一个中间关系表。

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

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

相关文章

全市场都忽视了!大摩:数据中心算力成本正在迅速下降

随着AI技术迈入普及与应用的新纪元,其算力需求蓬勃增长的同时,算力成本随技术进步呈现下降趋势。 摩根士丹利在3月24日的AI报告中指出,随着GPU技术的不断进步,例如英伟达从Hopper发展到Blackwell GPU架构,GAI的算力成…

怎么做到高效阅读、高效输出?

每一位得到的用户都是终身学习者,你一定对读书这件事不陌生。但是,并不是每个人都清楚,应该用什么标准选书,又怎么把一本书变成自己的精神资产。而这件事,陈章鱼特别擅长。 今天,我和陈章鱼一起挑选了4个有…

ChatGPT 对 ELT的理解

本文主要内容来自 ChatGPT 4.0 到底什么是 ETL?在数据库内部,把数据从 ODS 层加工成 DWD,再加工成 DWS,这个过程和 ETL 的关系是什么?带着这些问题,我问了一下 ChatGPT,总结如下。 数据在两个数…

线程安全介绍

线程安全的出现: 当两个或以上的线程同时操作一个共享变量时,就会涉及线程安全问题,不然会导致最后结果并不是我们所需要的。 线程安全定义: 线程安全(Thread Safety)是指一个对象或代码块在多线程环境中…

AWS EC2设置root登录

在使用亚马逊的服务器时,官方默认是使用密钥登录,跟国内的云服务器差别较大,本文记录下,如何开放AWS EC2的root登录。 一、通过网页版或者XShell登录服务器 这里略过 二、设置root账户密码 # 切换 root sudo -i # 设置或修改密…

【408直通车】(考研数一、二、三合集)线性代数公式全覆盖

线性代数 行列式: ∣ A B ∣ ∣ A ∣ ∣ B ∣ ∣ B ∣ ∣ A ∣ ∣ B A ∣ |AB| |A||B| |B||A| |BA| ∣AB∣∣A∣∣B∣∣B∣∣A∣∣BA∣ ∣ k A ∣ k n ∣ A ∣ |kA| k^n |A| ∣kA∣kn∣A∣ ∣ A T ∣ ∣ A ∣ |A^T| |A| ∣AT∣∣A∣ ∣ A − 1 ∣ ∣ A ∣ −…

静态住宅IP VS 动态住宅IP,怎么选择?

在进行海外 IP 代理时,了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和,并提供选择建议,帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…

CBLUEbenchmark代码跑通

CBLUEbenchmark 跑通 github源地址 1.配置 数据下载 新建文件夹CLBUEDatasets,将数据放在该文件夹下模型下载到github源地址中选择一个模型来下载: 将下载好的模型放在一个专门放模型的文件夹下,我这里是bert 文件如下所示放置: 2.训练模型&#xff…

宁德时代与特斯拉合作;钟睒睒连续四次中国首富丨 RTE 开发者日报 Vol.171

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

用java做一个双色球彩票系统

代码如下&#xff1a; import java.util.Random; public class HelloWorld{public static void main(String[] args){//1、生成中奖号码 int[] arrcreateNumber();for (int i 0;i<arr.length;i) {System.out.print(arr[i]" ");}}public static int[] createNu…

OJ刷题:字符串中的第一个唯一字符

力扣第387题&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入: s "leetcode"…

全自动引流,每日500+粉丝的秘诀

在如今竞争激烈的市场环境下&#xff0c;如何有效地吸引和保持精准粉丝成为了每个企业主或网红必须面对的问题。然而&#xff0c;许多人可能误以为全自动引流就意味着无人参与&#xff0c;实际上&#xff0c;它更多的是借助一些自动化工具和策略来提升我们的工作效率。今天&…

Flink Temporal Join 系列 (2):用 Temporal Table DDL 实现基于处理时间的关联

本文要演示的是:使用 Temporal Table DDL 定义被关联表(维表),然后基于主动关联表(事实表)的“处理时间”去进行Temporal Join(关联时间维度上对应版本的维表数据)。该演示涉及三个要点: 被关联的表(维表)是用 Temporal Table DDL 形式定义,必须是一张时态表(版本…

阿尔吉侬的花束 (典bfs)

0326重写&#xff0c;一个小时终于成功了 #include<algorithm> #include<iostream> #include<cstring> #include<queue>using namespace std;int t; int r,c; char mp[210][210]; bool vis[210][210]; struct node{int x,y; }; int dx[] {1,-1,0,0};…

EtherCAT主站SOEM -- 21 --Qt-Soem通过 CST模式(周期同步力矩模式)控制一个电机转圈圈

EtherCAT主站SOEM -- 21 --Qt-Soem通过 CST模式(周期同步力矩模式)控制一个电机转圈圈 0 QT-SOEM视频预览及源代码下载:0.1 QT-SOEM视频预览0.2 QT-SOEM源代码下载PS 特别注意1 程序文件修改替换1.1 allvalue.h1.2 motrorcontrol.h1.3 mainwindow.cpp1.4 motrorcontrol.cpp2…

揭秘网站采集是如何对网站产生影响的

网站建设中网站采集会不会降权&#xff1f;不少兄弟们想必有疑问&#xff0c;今天直接进入话题&#xff0c;如果觉得有价值&#xff0c;请进行朋友圈分享&#xff1a; 核心问题&#xff1a;文章可以采集吗&#xff1f; 答&#xff1a;当前信息在其他网站中已经大量重复&#…

《量子计算:揭开未来科技新篇章》

随着科技的不断发展&#xff0c;量子计算作为一项颠覆性的技术逐渐走进人们的视野&#xff0c;引发了广泛的关注和探讨。本文将围绕量子计算的技术进展、技术原理、行业应用案例、未来趋势预测以及学习路线等方向&#xff0c;深入探讨这一领域的前沿动态和未来发展趋势。 量子…

springboot swagger 接口文档分组展示

例如将 controller 分成四类&#xff0c;分别放到四个包下&#xff1a; xxx.xxx.xxx.controller.manage xxx.xxx.xxx.controller.client xxx.xxx.xxx.controller.authority xxx.xxx.xxx.controller.common SwaggerConfig.java&#xff1a; import io.swagger.annotations.Api…