【Entity Framework】 EF三种开发模式

news2024/9/20 20:35:12

【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.coloradmin.cn/o/1546488.html

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

相关文章

latex中的算法algorithm报错Undefined control sequence.

这里写目录标题 1. 错误原因2. 进行改正3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太一样,不能直接套用总结 1. 错误原因 我在算法中使用\State 2. 进行改正 换成\STATE 3. 爱思唯尔期刊与施普林格期刊对于算法的格式不太一样,不能直接套用 总…

跟踪一切!首次将DINO的语义先验用于视频中的密集、亚像素、长距离跟踪任务

作者:小柠檬 | 来源:3DCV 在公众号「3DCV」后台,回复「原论文」可获取论文pdf 添加微信:dddvision,备注:3D高斯,拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程:…

CentOS Stream 8系统配置阿里云YUM源

Linux运维工具-ywtool 目录 一.系统环境二.修改yum文件2.1 CentOS-Stream-AppStream.repo2.2 CentOS-Stream-BaseOS.repo2.3 CentOS-Stream-Extras.repo 三.只有一个配置文件四.其他知识4.1 如果想要启用其他源,修改文件配置:enabled14.2 国内源链接 一.系统环境 CentOS Strea…

C#学习笔记4:PC串口发送数据

今日继续我的C#学习之路,今日学习制作PC串口发送数据的窗口程序 串口是单片机上位机开发的重点,本文围绕做一个通过PC端串口发送数据的程序进行实践学习, 文章提供源码与解释、整体工程文件 目录 1、控件的选择与摆放: 2、程序设…

Collection与数据结构 顺序表与ArrayList

1. 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在…

libVLC 设置滤镜

在图像和视频处理中,滤镜是一种用于修改图像或视频帧外观的软件工具。滤镜可以通过各种方式改变图像的像素数据,以达到不同的视觉效果。以下是一些常见的滤镜类型: 颜色调整:这些滤镜可以改变图像的亮度、对比度、饱和度、色调等颜…

中科数安 || 设计公司的图档、文件资料、各类设计图纸怎么防止外泄,自动智能透明加密管理软件系统

#文件防泄密软件# 中科数安为设计公司提供了一整套针对图档、文件资料以及各类设计图纸的保密解决方案,帮助企业在多个层面上防止此类重要信息的外泄。 设计行业,部门 || 图档防泄密软件 PC地址: www.weaem.com 以下是中科数安可能采取…

搭建PHP本地开发环境:看这一篇就够了

什么是PHP本地开发环境 PHP本地开发环境是指在个人计算机上模拟的服务器环境,这使得开发者能够在没有网络连接的情况下也能开发、测试和调试PHP应用程序。就像在你的电脑里装个小“服务器”,即使没网也能搞定PHP程序的开发和修修补补。这就是PHP本地开发…

值迭代和策略迭代【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 文章目录 强化学习笔记一、Value It…

springboot企业级抽奖项目业务三(活动模块)

梅开三度 开发流程 该业务基于rouyi生成好了mapper和service的代码,现在需要在controller层写接口 实际操作流程: 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口文档 在用户模块用户…

Cisco firepower 2140 run ASA and config failover

1 背景 here we got 2 cisco firepower 2140 hardware appliance we’re planning to run ASA on it. and config failover for Primary Unit and Secondary Unit 现场2台Cisco firepower 2140防火墙, 运行ASA模式, 双机组HA,心跳线使用E1/1…

爬虫实践(1)

这一篇只提登录模拟,主要介绍chrome开发者窗口的使用,实际上相关接口调用都是用到cookie,需要再加一篇从token到cookie,以保证实践的完整性 以migu登录为例,分析其登录过程,之后可以使用任意语言模拟登录&…

如何利用FLUENT计算流体力学方法解决大气与环境领域流动问题

ANSYS FLUENT是目前全球领先的商用CFD 软件,市场占有率达70%左右,是工程师和研究者不可多得的有力工具。由于采用了多种求解方法和多重网格加速收敛技术,因而FLUENT能达到最佳的收敛速度和求解精度。灵活的非结构化网格和基于解的自适应网格技…

设置MATLAB三维绘图的视角

MATLAB三维绘图plot3在生成绘图后,默认显示视角是斜着的: 使用view(2)命令可以使其转成XoY平面(从上往下看的视角):

【第二部分--Python之基础】02

二、运算符与程序流程控制 1、运算符 1.1 算术运算符 算术运算符用于组织整数类型和浮点类型的数据,有一元运算符和二元运算符之分。 一元算术运算符有两个:(正号)和-(负号),例如&#xff1…

自动驾驶-如何进行多传感器的融合

自动驾驶-如何进行多传感器的融合 附赠自动驾驶学习资料和量产经验:链接 引言 自动驾驶中主要使用的感知传感器是摄像头和激光雷达,这两种模态的数据都可以进行目标检测和语义分割并用于自动驾驶中,但是如果只使用单一的传感器进行上述工作…

【Python】enumerate函数的使用方法,小白一看就懂

enumerate函数的使用方法: season[‘a’,‘b’,‘c’,‘d’] for i in enumerate(season): print(i) season[‘a’,‘b’,‘c’,‘d’] for i,eliment in enumerate(season): print(i,eliment) 输出结果为: 练习题: 2.给出10个学生姓名…

国内ip地址随意更换的潜在风险和策略

在数字化时代,IP地址是互联网通信的基础,而国内IP地址的随意更换可能带来一系列安全风险和问题。虎观代理小二将探讨国内IP地址随意更换的潜在影响以及如何有效应对这一挑战。 1.什么是国内IP地址? 国内IP地址是指在国内分配和使用的IP地址&…

【漏洞复现】用友U8C任意文件读取漏洞

声明:亲爱的读者,我们诚挚地提醒您,Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失,均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

ChatGPT 对 ELT的理解

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