02020405 EF Core基础05-EF Core反向工程、EF Core和ADO.NET Core的联系、EF Core无法做到的事情

news/2025/9/23 23:14:45/文章来源:https://www.cnblogs.com/python-web/p/19108338

02020405 EF Core基础05-EF Core反向工程、EF Core和ADO.NET Core的联系、EF Core无法做到的事情

1. 数据库设计的三种形式(视频3-9)

  • DB First → 先在数据库中将数据表建好了,然后再反向生成实体类。
    • 简单,但是不适合开发复杂项目。
  • Model First → 先创建一个类似于图形化模型的东西,再根据图形化来生成实体类和数据库。
  • Code First → 先手写实体类,然后根据实体类在数据库中生成数据表。
    • EF Core只支持这种。
1.1 反向工程介绍
  • 方向工程:根据数据库表来反向生成实体类
    • 在新项目里面,不推荐反向工程创建数据库。
    • 在已经有数据库的项目里面,可以使用。
Scaffold-DbContext 'Server=.;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer说明:Scaffold → 脚手架
1.2 先通过SSMS创建一个数据库
  • step1 → 删除现有数据库:CoreDataDb → 删除 → 删除对象面板 → 勾选:关闭现有连接(避免因为连接问题导致无法删除数据库)
图片链接丢失
  • step2 → 创先一个新数据库:数据库 → 新建数据库 → 数据库名称:MyDB → 确定
图片链接丢失
  • step3 → 创建数据表:MyDB → 表 → 新建 → 表 → 添加相关信息 → 确定
图片链接丢失
1.3 通过.NET Core控制台项目实现反向工程
  • step1 → 项目名称AutoCreateDB,并且添加EF Core相关的依赖包,如下演示直接复制.csproj文件部分来添加依赖包
// AutoCreateDB.csproj
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net5.0</TargetFramework></PropertyGroup></Project>
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// AutoCreateDB.csproj直接添加依赖包
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net5.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="microsoft.entityframeworkcore.sqlserver" Version="5.0.4" /><PackageReference Include="microsoft.entityframeworkcore.tools" Version="5.0.4"><PrivateAssets>all</PrivateAssets><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets></PackageReference></ItemGroup></Project>说明:
1. 在csproj里面直接添加,就不需要通过install-package microsoft.enti...这样安装依赖包了。
2. 此时AutoCreateDB项目只有一个Program.cs文件。
  • step2 → 在程序包管理器控制台输入如下代码。
    • 注意,设定当前项目AutoCreateDB为默认启动项,同时包管理器默认项目也为当前项目AutoCreateDB。
PM> Scaffold-DbContext 'Server=.;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer
Build started...
Build succeeded.
To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
PM> 
  • step3 → 解决方案资源管理器会自动生成对应的数据表和配置文件。
图片链接丢失
  • 反向生成的相关文件代码如下
// TPerson
using System;
using System.Collections.Generic;#nullable disablenamespace AutoCreateDB
{public partial class TPerson{public long Id { get; set; }public string Name { get; set; }public DateTime? BirthDay { get; set; }}
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;#nullable disablenamespace AutoCreateDB
{public partial class MyDBContext : DbContext{public MyDBContext(){}public MyDBContext(DbContextOptions<MyDBContext> options): base(options){}public virtual DbSet<TPerson> TPersons { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){if (!optionsBuilder.IsConfigured){
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.optionsBuilder.UseSqlServer("Server=.;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true");}}protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.HasAnnotation("Relational:Collation", "Chinese_PRC_CI_AS");modelBuilder.Entity<TPerson>(entity =>{entity.ToTable("T_Persons");entity.Property(e => e.Name).HasMaxLength(50);});OnModelCreatingPartial(modelBuilder);}partial void OnModelCreatingPartial(ModelBuilder modelBuilder);}
}说明:如果有多张表,操作流程一样,会自动生成多个实体类。
1.4 使用Force flag来生成表
  • 当已经通过反向工程生成了表,此时SSMS又手动增加了表,操作如下。
PM> Scaffold-DbContext 'Server=.;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer
Build started...
Build succeeded.
To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
The following file(s) already exist in directory 'E:\0201\EFCoreDemo\AutoCreateDB\': MyDBContext.cs,TPerson.cs. Use the Force flag to overwrite these files.
PM> 说明:直接使用Scaffold-DbContext 'Server=.;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true' 这个命令会报错。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
PM> Scaffold-DbContext 'Server=.;Database=MyDB;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer -Force
Build started...
Build succeeded.
To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
PM> 说明:此时可以再次增加SSMS中新增加的表对应的实体类。注意这样会丢失之前操作的数据,慎用反向工具。
1.5 反向工程注意事项
1、生成的实体类可能不能满足项目的要求,可能需要手工修改或者增加配置。
2、再次运行反向工程工具,对文件所做的任何更改都将丢失。
3、不建议把反向工具当成了日常开发工具使用,不建议DBFirst。
  • DB First一开始很爽,后面会让你慢慢想哭。Code First,YYDS。

2. EF Core底层如何操作数据库(视频3-10)

2.1 EF Core底层原理
  • 很多人说EF Core很烂,实际上是你不会用。不要轻易说EF Core不好。
  • 著名的程序员杨中科说过:框架是帮助程序员简化工作的,不是让程序员变成傻瓜的。
2.2 ADO.NET Core简介
图片链接丢失
  • 传统项目 → 应用程序直接和ADO.NET Core交互,ADO.NET Core把SQL命令扔给数据库去执行。
    • ADO.NET Core:把SQL指令扔给数据库执行的开发包。
2.3 EF Core底层是有ADO.NET Core存在的
图片链接丢失
  • 应用程序与ADO.NET Core之间多了EF Core。
    • 通过EF Core,那么应用程序就不用写SQL语句了,而是C#代码。由EF Core负责将C#代码生成SQL语句。
    • ADO.NET Core将EF Core生成的SQL语句扔给数据库执行。
    • EF Core底层任然是依靠ADO.NET Core把命令扔给数据库去执行。
  • EF Core和ADO.NET Core没有区别可言,它们两个根本不是一个层面的东西。
    • EF Core不是用来替代ADO.NET Core的
    • EF Core是基于ADO.NET Core的,EF Core的底层是基于ADO.NET的。
    • 其它的ORM框架,如Dapper、FreeSql等也和EF Core一样,将C#代码转换为SQL语句,然后交给ADO.NET Core。
2.4 EF Core到数据库的流程
图片链接丢失
  • EF Core和ADO.NET Core不是相互替代的关系,而是相互协作的关系。
2.5 查看EF Core生成的SQL语句
1、SQL Server Profiler查看SQLServer数据库当前执行的SQL语句。
2、var books = ctx.Books.Where(b => b.Price > 10 || b.Title.Contains("张"));
  • 在04020202中的7小结中有介绍SQL Server Profiler的用法。
2.6 EF Core总结
  • EF Core把C#代码转换为SQL语句的框架

3. EF Core有哪些做不到的事情(视频3-11)

3.1 EF Core无法支持的情况示例
  • C#千变万化;SQL功能简单。存在合法的C#语句无法被翻译为SQL语句的情况。
// 示例1:无法实现
var books = ctx.Books.Where(b => IsOK(b.Title));
private static bool IsOK(string s) // IsOK是自定义方法
{return s.Contains("张");
}
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
// 示例2:无法实现
var books = ctx.Books.Where(b =>b.Title.PadLeft(5)=="hello");
3.2 EF Core不同数据库的不同
图片链接丢失
var persons = ctx.TPersons.Where(p => p.Name.ToLower()=="杨中科"); // 在SQL Server中支持,在MySql中不支持。
  • AST → 抽象语法树(了解即可)。
    • C#代码有EF Core的核心翻译为AST。
    • 各种类型的数据库的EF Core Provider将AST翻译为各种数据库的SQL语句,再将SQL语句扔给各种数据库的ADO.NET Provider。

结尾

书籍:ASP.NET Core技术内幕与项目实战

视频:https://www.bilibili.com/video/BV1pK41137He

著:杨中科

ISBN:978-7-115-58657-5

版次:第1版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

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

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

相关文章

02020406 EF Core基础06-EF Core生成的SQL

02020406 EF Core基础06-EF Core生成的SQL 1. 通过代码查看EF Core的SQL语句(视频3-12) 1.1 方法1:标准日志 // 标准日志用法示例 public static readonly ILoggerFactory MyLoggerFactory= LoggerFactory.Create(b…

北京网站建设工作南京专业做网站的公司有哪些

面试中的收获&#xff1a; 优点&#xff1a; 1. 设计用例考虑较为全面。 2. 自动化&#xff0c;性能都有涉猎&#xff0c;但不深入。 3. 对业务理解较深入。 缺点&#xff1a; 1. 接口自动化停留在初级阶段。 2. UI自动化了解较少。 3. 性能压测缺少数据清洗等步骤。 4. 算法还…

菲斯曼售后服务中心贵港seo关键词整站优化

拦截器-interceptor 在现代的一些前端框架上&#xff0c;拦截器基本上是很基础但很重要的一环&#xff0c;比如Angular原生就支持拦截器配置&#xff0c;VUE的Axios模块也给我们提供了拦截器配置&#xff0c;那么拦截器到底是什么&#xff0c;它有什么用&#xff1f;拦截器能帮…

网站打不开服务器错误建手机网站多少钱

给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。解集不能包含重复的组合。 …

温州专业网站建设公司wordpress的链接怎么设置

把这个项目的文档迁入到SVN Server上的库中 【1】首先右键点击projectAdmin目录&#xff0c;这时候的右键菜单例如以下图看到的&#xff1a;选择copy URL toCLipboard,就是复制统一资源定位符&#xff08;URL&#xff09;到剪贴板中 https://KJ-AP01.中国.corpnet:8443/svn/pro…

中山建设监理有限公司 网站扁平化网站首页

随着数字化时代的来临&#xff0c;装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序&#xff0c;装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…

服装商城网站模板wordpress极简模板

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

网站编程培训班开发微信商城平台

串的概念&#xff1a;串&#xff08;字符串&#xff09;&#xff1a;是由 0 个或多个字符组成的有限序列。 通常记为&#xff1a;s ‘ a1 a2 a3 … ai …an ’ ( n≥0 )。 串的逻辑结构和线性表极为相似。 一些串的类型&#xff1a; 空串&#xff1a;不含任何字符的串&#x…

信阳公司做网站托管管理系统app

目录 主要内容 模型研究 1.模型总览 2.boost模块 3.Inverter模块 4.控制模块 5.信号模块 结果一览 下载链接 主要内容 该模型为光伏逆变器低电压穿越仿真模型&#xff0c;采用boost加NPC拓扑结构&#xff0c;基于MATLAB/Simulink建模仿真。模型具备中点平衡…

网页设计动态效果怎么制作西安seo优化公司

本问题已经有最佳答案&#xff0c;请猛点这里访问。下面两个SQL查询有什么区别和号根据以下两个测试结果速度更快(237比460)。据我所知&#xff0c;这是一个标准。。氧化镁不&#xff0c;有细微的差别&#xff0c;你不能说没有差别除了语法之外没有别的区别。虽然只有一个简短的…

用于做网站的软件wordpress微信公众号开发

MR混合现实情景实训教学系统是一种将虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;相结合的先进技术。在法律教学课堂上&#xff0c;MR教学系统为学生模拟模拟法庭、案例分析等多种形式&#xff0c;让学生在实践中掌握法律知识&#xff0c;提高法律…

新余 网站建设做手机网站多少钱

ResNet (Residual Network) 是由微软研究院的何凯明等人在2015年提出的一种深度卷积神经网络结构。ResNet的设计目标是解决深层网络训练中的梯度消失和梯度爆炸问题&#xff0c;进一步提高网络的表现。下面是一个ResNet模型实现&#xff0c;使用PyTorch框架来展示如何实现基本的…

甘肃省建设工程网上投标网站成都住房和城乡建设局网站首页

背景&#xff1a; staticMesh 会根据业务需要随时变化&#xff0c;然后通过staticMesh的大小自适应相机位置&#xff0c;捕捉画面用来预览该模型&#xff0c;使模型在画布中不会太大导致显示不全&#xff0c;也不会太小 参考&#xff1a; UE实现相机聚焦物体功能_右弦GISer的…

网页设计素材网站大全展馆设计都是找的什么公司

1. 概述Linux系统启动过程中通过init_task创建0号idle进程。然后通过kernel_thread创建1号init进程。创建该进程时通过系统调用&#xff0c;在内核空间执行用户空间的/sbin/init程序&#xff0c;通过该程序产生出shell&#xff0c;并依赖init衍生出其他进程。通过top命令查看当…

最基本的网络营销站点中小企业网站制作报价

题目描述 Kiana最近沉迷于一款神奇的游戏无法自拔。 简单来说&#xff0c;这款游戏是在一个平面上进行的。 有一架弹弓位于(0,0)处&#xff0c;每次Kiana可以用它向第一象限发射一只红色的小鸟&#xff0c;小鸟们的飞行轨迹均为形如的曲线&#xff0c;其中a,b是Kiana指定的参数…

河南省住建厅网站豫建设标微信推广平台

1. 缓存穿透 什么是缓存穿透&#xff1f; 缓存穿透说简单点就是大量请求的 key 是不合理的&#xff0c;根本不存在于缓存中&#xff0c;也不存在于数据库中 。这就导致这些请求直接到了数据库上&#xff0c;根本没有经过缓存这一层&#xff0c;对数据库造成了巨大的压力&…

杭州低价做网站国内永久免费域名申请网站

1、new Function的基础概念 new Function() 是 JavaScript 中的一个构造函数&#xff0c;它可以实例化一个新的函数对象并返回。该函数对象可以使用传递给 new Function() 的字符串参数作为函数体&#xff0c;并使用其他传递给它的参数作为函数参数&#xff0c;从而动态创建一…

云虚拟主机怎么使用沈阳网站的优化

SPM SPM&#xff08;shopping page mark&#xff0c;导购页面标记&#xff09; 是淘宝社区电商业务&#xff08;xTao&#xff09;为外部合作伙伴&#xff08;外站&#xff09;提供的跟踪引导成交效果数据的解决方案 注&#xff1a;也有解释 SPM 为超级位置模型(Super Position…

如何优化网站代码萍乡网站制作公司

Redis主从架构 Redis主从工作原理数据部分复制 Redis哨兵高可用架构client连接哨兵规则主节点挂了&#xff0c;集群从新选择主节点&#xff0c;并且同步给sentinel 转自图灵课堂 redis主从架构搭建&#xff0c;配置从节点步骤&#xff1a; 1、复制一份redis.conf文件2、将相关…

南昌高端网站开发建设高端网站公司哪家好

文章目录 1. 引言2. WebSocket和EventSource简介2.1 WebSocket2.2 EventSource 3. ChatGPT对话系统的特点4. EventSource的优势4.1 简单易用4.2 容错性强4.3 兼容性良好 5. 为何选择EventSource而非WebSocket&#xff1f;5.1 单向通信模式5.2 长轮询模式5.3 简化部署和维护 6. …