前提
EntityFramework(EF6)を使用し、DBからSELECTしDataGridViewへバインドさせています。
一定間隔で自動でSELECT~バインドを繰り返しているのですが、その間にDBのレコードの値を変更してもなぜかSELECTしたデータは変更前のままです。
DBのレコードの値変更は、SSMS(SQL Server Management Studio)で編集する機能から実施しています。
EntityFrameworkにキャッシュしたデータを都度読み出しているのかと思い、SQL Server Profilerで確認しましたが都度SELECTが実行されているようでした。
Contextのインスタンスをコンストラクタやプロパティの初期値などで生成すると古いデータがSELECTされ、バインドする直前に生成すると新しいデータがSELECTされます。
Contextはシングルトンなどで一度生成したら以後はそのまま・・・というような感じだったと記憶があったのですが、想定外の動きをして困っています。
※動き的には先にトランザクションをはってしまっているような感じ。
後者(バインドする直前にインスタンス生成)だと都度コネクション確立などが発生し処理負荷が高くなると考えており、なんとかContextは一度だけ生成して都度新しいデータをSELECTしたいです。
実現したいこと
- Contextは一度だけ生成して都度新しいデータをSELECTしたい
該当のソースコード
cs
1//メンバ変数 2private DbContext _context = new DbContext(); 3private System.Timers.Timer _timer; 4 5//コンストラクタ 6public Frm() 7{ 8 InitializeComponent(); 9 10 _timer = new System.Timers.Timer() 11 { 12 Interval = 1000, 13 AutoReset = false, 14 SynchronizingObject = this, 15 }; 16 _timer.Elapsed += _timer_Elapsed; 17} 18 19//フォームロード 20private void Frm_Load(object sender, EventArgs e) 21{ 22 _timer.Start(); 23} 24 25 26private async void _timer_Elapsed(object sender, ElapsedEventArgs e) 27{ 28 await BindViewAsync(); 29 _timer.Start(); 30} 31 32private async Task BindViewAsync() 33{ 34 List<model.test> tests = await _context.test.Where(r => l.State == 1).ToListAsync(); 35 DataGridView1.DataSource = tests.Select(r => new { ID = r.id, 名前 = r.name }).ToList(); 36}
試したこと
EntityFramework(EF6)からEntityFrameworkCore3.1へ変更しても同じでした。
補足情報(FW/ツールのバージョンなど)
VS2022
.NET Framework 4.7.2
WinForm
EntitiFramework(EF6)
SQL Server 2019 Express
※SQL Server認証など設定していますが、他は基本的に規定値のままです。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/08/11 13:57
2022/08/11 14:10
退会済みユーザー
2022/08/11 15:05
2022/08/11 15:34