多くの時間を費やしましたが、DbContext でのキャッシュを回避する方法をまだ理解できません。
私が何を意味するかを示すために、いくつかの簡単なケースのエンティティモデルを以下に添付しました。
問題は、dbcontext キャッシュが発生することです。たとえば、データベースからデータをクエリするための次のコードがあります。
using (TestContext ctx = new TestContext())
{
var res = (from b in ctx.Buildings.Where(x => x.ID == 1)
select new
{
b,
flats = from f in b.Flats
select new
{
f,
people = from p in f.People
where p.Archived == false
select p
}
}).AsEnumerable().Select(x => x.b).Single();
}
この場合、すべて問題ありません: 欲しいものを手に入れました (Archived == false の人のみ)。
しかし、その後に別のクエリを追加すると、たとえば、Archived フラグが true に設定されている人々がいる建物のクエリを追加すると、次のことがわかりません。
- 私の以前の結果、つまりresは、データによって追加されます (アーカイブされた == true の人物も追加されます)
- 新しい結果には、Archived が何に等しいかに関係なく、完全にすべての Person が含まれます
このクエリのコードは次のとおりです。
using (TestContext ctx = new TestContext())
{
var res = (from b in ctx.Buildings.Where(x => x.ID == 1)
select new
{
b,
flats = from f in b.Flats
select new
{
f,
people = from p in f.People
where p.Archived == false
select p
}
}).AsEnumerable().Select(x => x.b).Single();
var newResult = (from b in ctx.Buildings.Where(x => x.ID == 1)
select new
{
b,
flats = from f in b.Flats
select new
{
f,
people = from p in f.People
where p.Archived == true
select p
}
}).AsEnumerable().Select(x => x.b).Single();
}
ちなみに、 TestContext のコンストラクタでLazyLoadingEnabledを false に設定しています。
この問題を回避する方法を知っている人はいますか? linq to entityに実際に書いたものをクエリに含めるにはどうすればよいですか?
PS @Ladislav お手伝いできることはありますか?