私は、EntityFrameworkとSQLServer3.5を使用していくつかのシングルユーザーデスクトップアプリを開発してきました。あるコンテキストのEFキャッシュにレコードが入ると、別のコンテキストを使用してレコードが削除されると、新しいクエリが実行されても、最初のコンテキストのキャッシュからレコードが削除されないことをどこかで読んだと思います。したがって、私は本当に非効率的でわかりにくいコードを書いているので、別のメソッドが独自のコンテキストを使用してデータベースを変更するたびに、コンテキストを破棄して新しいコードをインスタンス化できます。
最近、これらの条件下で最初のコンテキストを再インスタンス化していないコードを発見しましたが、とにかく機能しました。何が起こっているのかを確認するための簡単なテストメソッドを作成しました。
using (UnitsDefinitionEntities context1 = new UnitsDefinitionEntities())
{
List<RealmDef> rdl1 = (from RealmDef rd in context1.RealmDefs
select rd).ToList();
RealmDef rd1 = RealmDef.CreateRealmDef(100, "TestRealm1", MeasurementSystem.Unknown, 0);
context1.RealmDefs.AddObject(rd1);
context1.SaveChanges();
int rd1ID = rd1.RealmID;
using (UnitsDefinitionEntities context2
= new UnitsDefinitionEntities())
{
RealmDef rd2 = (from RealmDef r in context2.RealmDefs
where r.RealmID == rd1ID select r).Single();
context2.RealmDefs.DeleteObject(rd2);
context2.SaveChanges();
rd2 = null;
}
rdl1 = (from RealmDef rd in context1.RealmDefs select rd).ToList();
最後の行にブレークポイントを設定すると、追加および削除されたエンティティが、最初のコンテキストの2番目のクエリによって実際に返されないことに驚きました。
私はいくつかの可能な説明:
- キャッシュされたレコードが再クエリ時に削除されないという私の理解は完全に間違っています。
- EFはキャッシングに気まぐれで、運の問題です。
- キャッシングはEF4.1で変更されました。
- この問題は、2つのコンテキストが同じプロセスでインスタンス化された場合には発生しません。
- SQL CE 3.5のキャッシュは、他のバージョンのSQLサーバーとは動作が異なります。
答えは最後の2つの選択肢の1つかもしれないと思います。必要がなければ、シングルユーザーデスクトップアプリのコンテキストを絶えず再インスタンス化する際のすべての面倒に対処する必要はありません。
SQL CE(3.5および4)を使用するシングルユーザーデスクトップアプリでこの検出された動作を信頼できますか?