O/Rマッピング程度のつもりでEntity Frameworkを
導入したら結構ハマりました。
/*
* 1回目、Table1.Code = 1を検索。
* この時点でTable1.Name=”AAA”
*/
var edm = new Data.EDMContainer();
var rows = edm.Table1.Where(“it.Code = 1”);
var r = rows.First();
System.Diagnostics.Trace.WriteLine(r.Name); -> “AAA”
/*
* 別クライアントから
* Table1.Nameを更新。
* この時点でDBの内容はTable1.Name=’BBB’
* となる
*/
/*
* 2回目、Table1.Code = 1を検索。
*/
var rows2 = edm.Table1.Where(“it.Code = 1”);
var r2 = rows.First();
System.Diagnostics.Trace.WriteLine(r2.Name); -> “AAA”
このロジックだと再検索してるつもりでも、
別クライアントからの変更が反映されません。
正解は2回目の検索のときに
「edm.Table1.Where」じゃなくて、
edm.Refresh(
System.Data.Objects.RefreshMode.StoreWins,
r);
で、最初に検索したオブジェクトの更新をすれば、
最新のデータを参照できるようです。
SQLプロファイラで確認した時は2回目の
「edm.Table1.Where」でもSQLをDBに発行している
ものの、1回目の検索で取得したオブジェクトの
内容を優先しているようです。
Entity Framework…もうちょっと直観的な
動きしてほしかった。