.NET Core 之 七 EF Core(二)

杨中科老师视频

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值