.NET 6教程,.Net Core 2022视频教程,杨中科主讲

异步
异步方法 在方法未完成前 会运行别的线程任务,等待异步执行后才会继续进行
异步方法的缺点:
1、异步方法会生成一个类,运行效率没有普通方法高
2、可能会占用非常多的线程
使用等待
Task.Delay()
Thread.Sleep()会阻塞当前线程
CancellationToken 提前终止任务
(浏览器关闭,对应的服务器端也应该进行关闭)
接口不用修饰Async 接口一般就定义返回值、参数,没有具体的方法体
yield
LINQ
List.Any(可以带条件)
判断是否至少有一条数据 与Count差不多,不过count是总数量,Any是只有有一条就返回 效率比较高
依赖注入DI
简化模块的组装过程,降低模块之间的耦合度
三种类型
Singleton(单列_一半不需要类状态的话)
Scope(在自定范围内使用)
Transient(瞬时每次都会新创建一个对象,比较耗内存)
在注册时分为服务类型、实现类型,这两个类型可以是同一个类
配置系统
三种配置方式
IOptions<T> 不会读取到新的值 适用于一般配置场景
IOptionsMonitor<T>适用于需要热更新配置并且全局统一的场景
IOptionsSnapshot<T>适用于需要热更新配置并且服务内统一的场景 推荐使用
EF Core
Migration Up Down 向上迁移、向下迁移
Add-Migration name 新增迁移操作
Update-Database 同步到数据库
Update-Database xxx 回滚到xxx的状态
Remove-migration 删除最后一次的迁移脚本
Script-Migration A D 生成迁移SQL代码 A-D
Script-Migration D 生成迁移SQL代码 D-最新
反向工程
根据数据库表来反向生成实体类
DBFirst(数据库优先)
ModelFirst (目前已经不使用了)
CodeFirst(代码优先)
Scaffold-DbContext
'Server=.;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer
需注意EF查询的LINQ语句无法编译其中加的自定义方案
EF Core一对多关系配置
HasOne WithMany
Include(关联对象) 查询关联表信息(导航属性)
单向导航属性配置
HasOne().WithMany()
多对多关系配置
HasMany<T>().WithMany().UsingEntity(j=>j.Totable())
IQueryable与IEnumerable
IEnumerable 在内存中操作(客户端评估)
IQueryable 翻译成SQL语句(服务器端评估)
IEnumerable 的查询会取出说有数据,再在内存中进行匹配,效率较差
IQueryable的延迟执行
非总结方法的时候不会执行,GroupBy、Take
执行终结方案会立即查询 ToArray、Min()
如果返回值是IQueryable就是非终结方法
IQueryable默认是使用DatAdapter的方式分批次执行 可以用ToArray()、ToList()一次性加载
EF执行原生SQL语句
非查询语句
dbCtx.Database.ExecuteSqlInterpolated()
实体查询语句
ctx.Entity.FromSqlInterpolated()
任意查询语句(使用原生ADO.NET)
conn = ctx.Database.GetDbConnection();
var cmd = conn.CreateCommand();
cmd.CommandText="";
cmd.ExecuteReaderAsync();
...
如何知道实体数据变了
快照更改跟踪:只要一个实体对象和DBConetent发生任何关系(Select、Add...)都默认会被DbContexnt跟踪
执行SaveChanges时会进行比较
AsNoTracking() 不进行跟踪(只查询,不做修改、删除可以使用,不占用内存)
EF Core全局查询筛选器
builder.HasQueryFil eter(a=>a.id>0)
忽略全局查询筛选器
ctx.entitys.IgnoreQueryFilters().Where()
EF Core并发控制
悲观锁
通过Sql语句来使用并发控制
独占、排他,并发大的话会严重影响性能,使用不当会导致死锁
乐观锁
Update T set TT=新值 where ID =1 and TT=旧值
并发令牌
builder.Property(h=>h.xxx).IsConcurrencyToken();
catch(DbUpdateConcurrencyException ex)
{xxxx}
RowVersion
设置一个byte[]类型的属性做并发令牌属性
每次插入或更新数据库会自动为这一行的RowVersion自动更新值
class House{
public byte[] RowVer{get;set}
}
builder.Property(h=>h.RowVer).IsRowVersion();
表达式树 Expression Tree
Expression<TDelegate>
Expression<Func<Book,Bool>> e1 = b=>b.Price>5;
.Net 6新语法、特性
顶级语句
全局Using引用资源
Using资源管理
文件范围的命名空间声明
可空引用类型
record比较引用