EF 核心 6 和 .NET 6。
假設我的所有物體都有一個LastUpdateAt屬性,該屬性DateTime在每次添加或修改物體時都會更新。
我從背景關系中獲取一個物體并將其顯示給用戶(網頁、WPF 視窗等)。在某些時候,用戶單擊了保存按鈕。
在我保存之前,我想檢查自從我得到我的副本后該物體是否已被其他人更新。但是,我正在努力了解如何做到這一點。
如果我查詢背景關系,它只會回傳我已經擁有的物體(包括我的用戶所做的任何更改)。
如果我重繪 物體,它會覆寫我背景關系中的物體,從而丟失用戶的更改。
如何檢查資料庫版本的時間戳是否比我背景關系中的時間戳更新?
謝謝
uj5u.com熱心網友回復:
將討論移至此處,因為我需要粘貼更長的文本。在本文中說,在 SaveChanges() 期間,如果同時修改了 DATABASE 版本,則會拋出 DbUpdateConcurrencyException。在該例外情況下,您擁有所有 3 個值,您可以決定如何解決沖突:
解決并發沖突涉及將來自當前 DbContext 的未決更改與資料庫中的值合并。合并的值將根據應用程式而有所不同,并且可能由用戶輸入指示。
有三組值可用于幫助解決并發沖突:
當前值是應用程式試圖寫入資料庫的值。原始值是在進行任何編輯之前最初從資料庫中檢索的值。資料庫值是當前存盤在資料庫中的值。
uj5u.com熱心網友回復:
如果您正在加載物體,保持 DbContext 實體打開,更新該物體,然后保存到同一個 DbContext 實體,那么默認情況下您依賴 EF 來管理并發。這遵循“最后的勝利”。[ConcurrencyCheck]您可以通過在 LastUpdateAt 屬性上添加 a 或使用 Row Version 來讓 EF 管理并發性[Timestamp]。如果基礎資料已更新,這將導致 EF 更新失敗。從那里你必須決定你想如何處理它。
如果您想自己執行并發檢查,那么有幾個選項。
使用分離物體或投影視圖模型構建代碼以縮短 DbContext 的生命周期。這通常會對您的代碼性能產生持續的好處,因為原始壽命較長的 DbContext 可以很容易地找到導致膨脹的方法,或者如果存活時間過長則積累“中毒”物體。Automapper 是一個很好的工具,可以幫助您
ProjectTo獲取視圖模型,然后Map(source, destination)復制這些值。通過這種方式,您加載資料,包括最后修改的值,進行更改,然后在保存時加載資料,驗證修改的值等,然后復制值并保存。范圍一個
DbContext實體以在保存之前檢查資料。
.
private DateTime getFooLastUpdateAt(int fooId)
{
using(var context = new AppDbContext())
{
var lastUpdateAt = context.Foos
.Where(x => x.FooId == fooId)
.Select(x => x.LastUpdateAt)
.Single();
return lastUpdateAt;
}
}
這可以使用注入的DbContext工廠等來創建DbContext實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426638.html
上一篇:檢測到可能的物件回圈
