.NET 6教程,.Net Core 2022視頻教程,楊中科主講

異步
異步方法 在方法未完成前 會運行別的線程任務,等待異步執(zhí)行后才會繼續(xù)進行
異步方法的缺點:
1、異步方法會生成一個類,運行效率沒有普通方法高
2、可能會占用非常多的線程
使用等待
Task.Delay()
Thread.Sleep()會阻塞當前線程
CancellationToken 提前終止任務
(瀏覽器關(guān)閉,對應的服務器端也應該進行關(guān)閉)
接口不用修飾Async 接口一般就定義返回值、參數(shù),沒有具體的方法體
yield
LINQ
List.Any(可以帶條件)
判斷是否至少有一條數(shù)據(jù) 與Count差不多,不過count是總數(shù)量,Any是只有有一條就返回 效率比較高
依賴注入DI
簡化模塊的組裝過程,降低模塊之間的耦合度
三種類型
Singleton(單列_一半不需要類狀態(tài)的話)
Scope(在自定范圍內(nèi)使用)
Transient(瞬時每次都會新創(chuàng)建一個對象,比較耗內(nèi)存)
在注冊時分為服務類型、實現(xiàn)類型,這兩個類型可以是同一個類
配置系統(tǒng)
三種配置方式
IOptions<T> 不會讀取到新的值 適用于一般配置場景
IOptionsMonitor<T>適用于需要熱更新配置并且全局統(tǒng)一的場景
IOptionsSnapshot<T>適用于需要熱更新配置并且服務內(nèi)統(tǒng)一的場景 推薦使用
EF Core
Migration Up Down 向上遷移、向下遷移
Add-Migration name 新增遷移操作
Update-Database 同步到數(shù)據(jù)庫
Update-Database xxx 回滾到xxx的狀態(tài)
Remove-migration 刪除最后一次的遷移腳本
Script-Migration A D 生成遷移SQL代碼 A-D
Script-Migration D 生成遷移SQL代碼 D-最新
反向工程
根據(jù)數(shù)據(jù)庫表來反向生成實體類
DBFirst(數(shù)據(jù)庫優(yōu)先)
ModelFirst (目前已經(jīng)不使用了)
CodeFirst(代碼優(yōu)先)
Scaffold-DbContext?
'Server=.;Database=demo1;Trusted_Connection=True;MultipleActiveResultSets=true' Microsoft.EntityFrameworkCore.SqlServer
需注意EF查詢的LINQ語句無法編譯其中加的自定義方案
EF Core一對多關(guān)系配置
HasOne WithMany
Include(關(guān)聯(lián)對象) 查詢關(guān)聯(lián)表信息(導航屬性)
單向?qū)Ш綄傩耘渲?/p>
HasOne().WithMany()
多對多關(guān)系配置
HasMany<T>().WithMany().UsingEntity(j=>j.Totable())
IQueryable與IEnumerable
IEnumerable 在內(nèi)存中操作(客戶端評估)
IQueryable 翻譯成SQL語句(服務器端評估)
IEnumerable 的查詢會取出說有數(shù)據(jù),再在內(nèi)存中進行匹配,效率較差
IQueryable的延遲執(zhí)行
非總結(jié)方法的時候不會執(zhí)行,GroupBy、Take
執(zhí)行終結(jié)方案會立即查詢 ToArray、Min()
如果返回值是IQueryable就是非終結(jié)方法
IQueryable默認是使用DatAdapter的方式分批次執(zhí)行 可以用ToArray()、ToList()一次性加載
EF執(zhí)行原生SQL語句
非查詢語句
dbCtx.Database.ExecuteSqlInterpolated()
實體查詢語句
ctx.Entity.FromSqlInterpolated()
任意查詢語句(使用原生ADO.NET)
conn = ctx.Database.GetDbConnection();
var cmd = conn.CreateCommand();
cmd.CommandText="";
cmd.ExecuteReaderAsync();
...
如何知道實體數(shù)據(jù)變了
快照更改跟蹤:只要一個實體對象和DBConetent發(fā)生任何關(guān)系(Select、Add...)都默認會被DbContexnt跟蹤
執(zhí)行SaveChanges時會進行比較
AsNoTracking() 不進行跟蹤(只查詢,不做修改、刪除可以使用,不占用內(nèi)存)
EF Core全局查詢篩選器
builder.HasQueryFil eter(a=>a.id>0)
忽略全局查詢篩選器
ctx.entitys.IgnoreQueryFilters().Where()
EF Core并發(fā)控制
悲觀鎖
通過Sql語句來使用并發(fā)控制
獨占、排他,并發(fā)大的話會嚴重影響性能,使用不當會導致死鎖
樂觀鎖
Update T set TT=新值 where ID =1 and TT=舊值
并發(fā)令牌
builder.Property(h=>h.xxx).IsConcurrencyToken();
catch(DbUpdateConcurrencyException ex)
{xxxx}
RowVersion
設(shè)置一個byte[]類型的屬性做并發(fā)令牌屬性
每次插入或更新數(shù)據(jù)庫會自動為這一行的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比較引用