0

テーブル全体をキャッシュする場合:

static List<Table1> table1Cache = context.Table1.ToList();

次に、それを使用して関連付けます。

var context = new Context();
var t2 = new Table2();
t2.MyTable1Reference = table1Cache.Single(x=>x.Id == paramIntId);
context.SaveChanges();

3行目のため、新しい行がTable1に挿入されます。EFはそれが新しい実体であると考えています。コンテキストの作成時に常にキャッシュをアタッチする(リクエストごとに1つのコンテキストがある)、またはMyTable1ReferenceID = table1Cache.Single(x => x.Id == paramIntId).Id;を使用するなどのことができることを知っています。

しかし、それは安全ではありません、私は時々忘れることができます、良い解決策がありますか?

4

1 に答える 1

0

はい、エンティティは現在現在のコンテキストに関連付けられていないため、これは理にかなっています。したがって、EFはそれが一時的なものであると見なし、新しいインスタンスを保存します。

コンテキスト間でキャッシュしている場合は、オブジェクト自体を保存する必要はありません。それは文脈に関連しています。代わりに、データをキャッシュに保存する必要があります。基本的に、エンティティのシリアル化と逆シリアル化。また、現在のコンテキストでエンティティを関連付ける必要があるため、次にキャッシュから取得するときに、キャッシュとデータベースの両方に変更を保存できます。

これがすべてたくさんのように聞こえるなら、そうです。2つのデータストアの同期を維持することは、簡単に解決できる問題ではありません。NHibernateの2次キャッシュの実装を見てみましょう。

于 2012-06-29T16:41:40.607 に答える