杨中科老师视频
.NET 5教程,.Net Core 2021视频教程,杨中科主讲_哔哩哔哩_bilibili
一、主键不是小事,数据库设计、优化
EF Core 支持多种主键生成策略:自动增长,Guid,Hi/Lo算法等
自动增长
,数据库自动赋值
优点:简单,缺点:数据库迁移以及分布式系统中比较麻烦,并发性差;
Savechanges后会自动把主键的值更新到Id属性
Guid算法
,适用于分布式系统,EF Core赋值
优点:简单、高并发、全局唯一,缺点:磁盘空间占用大
Guid值不连续,使用Guid类型做主键的时候,不能把主键设置为聚集索引,因为聚集索引是按照顺序保存主键的,因此用Guid做主键并设置为聚集索引性能差,比如:mysql的InnoDB引擎中主键是强制使用聚集索引的。在sql server等中,不要把Guid主键设置为聚集索引,在mysql中不要用Guid做主键。
演示Guid存储,推荐手动赋值,Guid.NewGuid()
其他方案
1、
混合自增和Guid(非复合主键)
,用自增列做物理主键,而用Guid列做逻辑上的主键,把自增列设置为表的主键,而在业务上查询数据时把Guid当作主键使用,在和其他表关联以及和外部系统通讯的时候都是用Guid列,不仅保证了性能,而且利用了Guid的优点,而且减轻了主键自增性导致主键值可被预测带来的安全性问题。
2、
Hi/Lo算法
优点:高效,缺点,HiLo算法不是EF Core的标准,不支持所有数据库,支持SQL Server;
用法自己看文档;
二、深入研究 Migrations
向上迁移(Up),向下迁移(Down)退回到旧的迁移
分析Migrations下的代码,分析Up、Down方法;
三、Migration 其他命令
1、
update-database xxx 到某个迁移节点
2、
Remove-Migration 删除最后一次迁移脚本
先要update-database回退到某个节点(删除数据库表),再执行Remove-Migration删除最后一次的
3、
Script-Migration 生成迁移sql脚本
为什么要生成sql脚本,用于生产环境数据库更新
Script-Migration D F 生成版本D到版本F的sql脚本
Script-Migration D 生成版本D到最新版本的sql脚本
四、反向工程
根据数据库表来反向生成实体类,仅推荐用于已有数据库表时使用;
DB First,Mode First(图形),Code First
代码演示
1、保证项目中已经安装了EF Core和EF Core.Tools的依赖包
2、控制台输入命令
Scaffold-DbContext ‘数据库连接字符串’ Microsoft.EntityFrameworkCore.SqlServer
3、可以使用
Scaffold-DbContext ‘数据库连接字符串’ Microsoft.EntityFramework.Core.SqlServer -Force 命令再次覆盖重新生成代码,会修改值钱的代码,不推荐使用;
五、EF Core底层如何操作数据库
1、为什么要了解EF Core底层原理,更好解决问题,充实能力
框架是帮助程序员简化工作的,不是把程序员变成傻瓜的
2、ADO.NET Core
3、
4、Sql Server Profiler 工具查看sql
EF Core是一个把C#代码转换为sql语句的框架
六、EF Core有哪些做不到的事情
代码演示
C#千变万化,总有一些语法无法被转换成sql,编译成功运行报错
原理:
AST,编译原理:抽象语法树
七、通过代码查看EF Core生成的sql语句
方法1:标准日志,
optionsBuilder.UseLoggerFactory(MyLoggerFactory);
代码演示
方法2:简单日志
optionsBuilder.LogTo(msg=>{console.writeLine(msg)});
输出了EF Core整个过程
过滤掉不需要的信息
方法3:
ToQueryString() IQueryable扩展方法,只能用于查询操作
总结:测试性代码,用简单日志;正式上线或排查故障,用标准日志;开发阶段,从繁杂的查询操作中立即看到sql,用ToQueryString();
八、同样的Linq被翻译为不同的sql语句
EF Core 迁移脚本和数据库相关
通过给Add-Migration命令添加“-OutputDir”参数的形式来在同一个项目中为不同的数据库生成不同的迁移脚本
演示Linq翻译成的sql
Mysql项目
1、EF Provider的选择
2、NuGet安装 pomelo.EntityFrameworkCore.Mysql
3、 optionsBuiler.useMysql(‘server=localhost;user=root;password=root;database=demo1’,new MySqlServerVersion(new Version(8,0,19)));官方文档
演示生成Mysql Migration脚本
Linq生成的mysql sql语句
postgraSQL项目
,开源
NuGet安装 Npgsql.EntityFrameworkCore.PostgraSql 准官方
optionsBuilder.UseNpgsql(“Host=localhost;Database=demo1;Username=postgres;Password=123456”); 官方文档
演示生成postgraSql Migration脚本
Linq生成的PostgreSql sql脚本
演示相同Linq在不同数据库时,不能翻译成对应的sql语句