文章出處

在 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 不是同一個實例。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()