對Entity Framework Core的一次誤會:實體狀態不跟蹤


在 Entity Framework 中,當通過 EF 使用 LINQ 查詢獲取到一個實體(實際得到的是 EF 動態生成的實體類的代理類的實例)時,這個實體的狀態默認是被跟蹤的。所以,當你修改實體的某些屬性值之后調用 SaveChanges() ,EF 會生成只針對這些被修改屬性的 UPDATE SQL 語句。

但是最近使用 Entity Framework Core 時遇到一個問題,通過 LINQ 查詢得到一個實體后,修改實體的屬性值並執行 SaveChanges() 時,EF Core 沒有生成任何 SQL 語句,也就是實體的狀態沒有被跟蹤。

開始誤以為是 EF Core 實體跟蹤特性的改變,於是采用了這樣的解決方法:顯式地調用 Attach() 方法並用其返回值獲取被跟蹤的實體,然后修改它的屬性值。

var userEntity = _userDbContext.Attach<User>(user);
if (userEntity == null)
{
    throw new NullReferenceException(nameof(userEntity));
}
userEntity.Entity.Status = UserStatus.Normal;
await _userDbContext.SaveChangesAsync();

后來發現是錯怪了 EF Core ,問題的真正原因是應用程序中 UnitOfWork 的設計問題造成查詢實體的 DbContext 與 SaveChangesAsync() 的 DbContext 不是同一個實例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM