.NET Core 之 七 EF Core(二)

  • Post author:
  • Post category:其他


杨中科老师视频


.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语句



版权声明:本文为a313966416原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。