本文章是根據 微軟MVP solenovex(楊旭)老師的視頻教程編寫而來,再加上本身的一些理解。
視頻教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
GitHub源碼:https://github.com/hllive/LearnEFCore3.1前端
EFCore只能刪除被Context追蹤的數據,數據怎麼能被追蹤呢,只能先查詢出來,而後操做刪除方法,刪除方法有四種,如代碼所示;調用Remove()或RemoveRange()方法後尚未數據庫執行動做,只有調用_dbContext.SaveChanges()
纔會執行數據庫事務操做並返回影響行數。git
[HttpDelete] public IActionResult DeleteLeague() { //先查詢出來,由於只能刪除被追蹤的數據 var league = _dbContext.Leagues.SingleOrDefault(l => l.Country == "貴州"); if (league == null) return NotFound(); //一、單獨刪除方法 _dbContext.Leagues.Remove(league);//刪除單個Leagues _dbContext.Remove(league);//直接在context上Remove()方法傳入model,它會判斷類型 //二、批量刪除方法 var league2 = _dbContext.Leagues.SingleOrDefault(l => l.Country == "中國"); _dbContext.Leagues.RemoveRange(league, league2); _dbContext.RemoveRange(league, league2); //執行數據庫操做 int count = _dbContext.SaveChanges(); return Ok(count); }
修改數據與刪除數據有點像,也是須要被Context追蹤的數據,而後才能進行修改,所追蹤的對象裏有個狀態屬性,狀態設爲Modify,調用SaveChanges()時纔會執行相應的修改,修改某個字段後,context就知道某個字段已經被修改。github
[HttpPut] public IActionResult UpdateLeague() { //先查詢出來,由於操做被追蹤的數據 var league = _dbContext.Leagues.FirstOrDefault(); //修改Name屬性,被追蹤的league狀態屬性就會變爲Modify league.Name += "-"; //執行數據庫操做 int count = _dbContext.SaveChanges(); return Ok(count); }
根據執行結果能夠看出,只修改了Name字段,這就是由於EFCore追蹤的數據,League類的name值改變了,因此才執行修改Name字段。數據庫
若是修改多條記錄,也就是修改集合數據,這時候EFCore就會生成集合數量的UPATE的SQL語句,若是有100條數據須要修改,EFCore就會生成100條UPATE的SQL語句。這種修改方法不太適合咱們的業務場景。ide
在實際狀況中,對象不必定是從數據庫中查詢出來的,而是由前端傳入的JSON數據。這時候就不能被EFCore追蹤,可使用context.Update()方法進行數據追蹤ui
經過context查詢出來的數據都會被EFCore變化追蹤的,進行變化追蹤可能會消耗大類的內存或CPU處理,若是查詢量比較大,並且不須要變化追蹤,能夠經過
AsNoTracking()
方法使對象不被EFcore追蹤,例如:_dbContext.Leagues.AsNoTracking().FirstOrDefault();
。在AsNoTracking()
後也須要執行First()或ToList()纔會真正執行數據庫查詢。code
[HttpPut("test")] public IActionResult UpdateLeague2() { //var league = _dbContext.Leagues.AsNoTracking().FirstOrDefault(); //這裏模擬前端傳過來的JSON數據序列化爲對象 var league = new League { Id = new Guid("EDAAEE79-78C9-43B5-A924-08D845203D11"), Name= "貴州貴陽足球聯賽" }; //修改對象的屬性 league.Name = league.Name.Replace("貴州貴陽", "遵義仁懷"); //讓context進行追蹤,並知道它已經被修改 _dbContext.Leagues.Update(league); //執行數據庫操做 int count = _dbContext.SaveChanges(); return Ok(count); }
這種離線的數據(沒有被追蹤)使用context.Update()方法執行時,EFCore不知道那些屬性或字段已經被修改那些沒有被修改。這種生成的SQL語句會把全部字段都從新賦值一遍,若是沒有賦值會被設置爲NULL,如上圖執行結果,Country屬性原本沒有修改,執行SQL語句時被設置爲NULL
若是隻想修改某一個屬性的話也是能夠作到的,之後再寫。。。視頻
博客文章能夠轉載,但不能夠聲明爲原創對象