我有一個計時器,它會每 10 秒過去一次。計時器結束后,它將呼叫我的服務,然后從我的服務中獲取資料并將其分配給我的 radzen 表,然后 StateHasChanged 將重新呈現頁面并更新更改。
@using System.Timers;
Timer _timer;
protected override async Task OnInitializedAsync()
{
StartTimer();
}
private void StartTimer()
{
_timer = new System.Timers.Timer();
_timer.Interval = 10000; //every 10 seconds
_timer.Elapsed = DashboardTimerElapsed;
_timer.Start();
}
private async void DashboardTimerElapsed(Object source, ElapsedEventArgs e)
{
await FetchData();
}
private async Task FetchData()
{
dashboardData = await getDataService.GetDataAsync();
await InvokeAsync(StateHasChanged);
}
計時器已過,一切正常,我遇到的唯一問題是,如果我的應用程式正在運行,我會對資料庫中的資料之一進行更改,例如:將值名稱“shazam”更改為“shazamm”。在過去,我的新資料應該拉下“shazamm”,但是當我查看 dashbardData 時,我可以看到它不是拉下“shazamm”,而是拉下我認為是 dbcontext 的舊實體的“shazam”。(順便說一句,我的 dbcontext 是有范圍的)-
services.AddDbContext<DbContext>(options => {
options.UseSqlServer(Configuration.GetConnectionString("DbContextURL"));
}, ServiceLifetime.Scoped);
誰能看到我哪里出錯了,請幫助我?謝謝你!
uj5u.com熱心網友回復:
計時器事件將在與計時器實體相同的范圍內觸發。選項包括:
a) 使用LifetimeScope.Transient,盡管這可能會與其他服務發生沖突,并且會從跨范圍共享的實體中受益,尤其是在傳遞物體的情況下。
b) 在您的計時器內確定 DbContext 實體的范圍,而不是依賴使用注入的 DbContext 的共享服務。
c)AsNoTracking()用于您的計時器讀取。這將確保從資料庫中讀取回傳的物體。(使用 EF6 驗證,在 EF Core 中應保持一致)這可能意味著在您的服務中引入類似默認引數的內容,以指示是否附加AsNoTracking()到查詢以確保重新讀取。
d) 基于投影而不是回傳物體實體進行查詢。例如,當您撰寫要使用的查詢.Select()或.ProjectTo()(Automapper) 時,它們將自動回傳當前資料庫狀態,避免可能在跟蹤實體中的陳舊資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/350461.html
上一篇:EntityFramework5.0Contains/Equals/StartsWith/EndWithinAny不能像在EFCore2.2中那樣在SQL中進行轉換
